JAVA設計モードの工場モード簡単解説(一)


自動回転http://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html **
一、設計モードの分類
*作成型モード(5種類):工場方法モード、単例モード、抽象工場モード、建築者モード、原型モード。構造型モード(7種類):装飾者モード、アダプターモード、プロキシモード、外観モード、ブリッジモード、組合せモード、享元モード。行動パターン(11種):観察者モード、ポリシーモード、テンプレート方法モード、反復子モード、責任連鎖モード、コマンドモード、メモモード、ステータスモード、訪問者モード、仲介者モード、インタプリタモード。二つのタイプがあります。そしてヘアスタイル、スレッドプールモードです。
工場モード:主に共通のインターフェースがある種類を実例化するために用いられ、工場モードはその種類を動的に決定することができます。主に3つの形態があります。簡易工場(Simple Factory)の工場法(Factory Method)の抽象工場(Abstractory)①簡易工場(静工場):パラメータを受信するための静的な方法があり、パラメータに基づいて同じインターフェースを実現するための異なる種類の例を返します。例えば、工場で洗濯機を作ったり、冷蔵庫を作ったり、エアコンをつけたりします。
//①                 
public interface Product{} 
//②                      
public class Washer implements Product{ 
   public Washer(){ 
       System.out.println("       "); 
   } 
} 

public class Icebox implements Product{ 
   public Icebox(){ 
       System.out.println("      "); 
   } 
} 

public class AirCondition implements Product{ 
   public Icebox(){ 
       System.out.println("      "); 
   } 
} 
//③       ,            
public class SimpleFactory { 

    public static Product factory(String productName) throws Exception{ 
        if(productName.equals("Washer")){ 
            return new Washer(); 
        }else if(productName.equals("Icebox")){ 
            return new Icebox(); 
        }else if(productName.equals("AirCondition")){ 
            return new AirCondition(); 
        }else{ 
            throw new Exception("     "); 
        } 
    } 
} 
//④       ,           ,SimpleFactory                 。
public static void main(String[] args) { 
    try { 
              SimpleFactory.factory("Washer"); 
              SimpleFactory.factory("Icebox"); 
              SimpleFactory.factory("AirCondition"); 
            } catch (Exception e) { 
        e.printStackTrace(); 
    } 
} 
簡単な工場の核心はSimpleFactory類です。彼は必要な論理判断能力とすべての製品の作成権利を持っています。私達は注文書を彼に渡すだけで、私達が欲しい製品を手に入れることができます。これはとても使いやすいようです。しかし、実際には、このSimpleFactoryには多くの限界があります。まず、私たちは新しい製品を追加するたびに、SimpleFactoryのコードを修正しなければなりません。第二に、多くの製品を持っています。また、複雑なレベル関係があります。この種類は複雑な論理判断能力を持っていなければなりません。コードの量もどんどん増えてきます。これは今後のメンテナンスに対して恐怖の二文字です。システムは仕事ができない状態に入ります。これも一番致命的なポイントです。②工場方法:工場方法は工場種類にインターフェースを定義して、多状態で工場類の機能を弱めました。
//①       
public interface Factory{ 
  public Product create(); 
} 
//②          
public interface Product{} 
// ③           
public class Washer implements Product{ 
   public Washer(){ 
       System.out.println("       "); 
   } 
} 

public class Icebox implements Product{ 
   public Icebox(){ 
       System.out.println("      "); 
   } 
} 

public class AirCondition implements Product{ 
   public Icebox(){ 
       System.out.println("      "); 
   } 
} 
//④              
//         
public class CreateWasher implements Factory{ 
    public Product create(){ 
          return new Washer(); 
    } 
} 

//        
public class CreateIcebox implements Factory{ 
    public Product create(){ 
          return new Icebox(); 
    } 
} 

//        
public class CreateAirCondition implements Factory{ 
    public Product create(){ 
          return new AirCondition(); 
    } 
} 
工场の方法と简単な工场の主な违いは、简単な工场は制品を作る机能を一つのクラスに置いています。工场の方法は违う制品を工场のインタフェースを実现した异なる工场に置いています。このように一つの工场に问题があっても、彼の工场の种类は正常に仕事ができます。工場のインターフェースを実現する工場類を追加してもいいです。既存のコードを修正しなくてもいいです。しかし、工場の方法には彼の限られたところがあります。つまり、直面する製品には複雑な等級構造がある場合、例えば、工場は家電以外の製品を生産し、携帯電話の製品を生産します。そうすると、家電は携帯電話です。これで複雑な製品ツリーができます。工場の方法でこの製品の家族システムを設計するなら、各型番の製品に対応する工場類を作らなければなりません。数百種類から千種類以上の製品がある時、対応する百数千の工場類が必要です。これは伝説的な爆発が起きました。今後のメンテナンスにとっては、まさに災難です。
③抽象工場:一連の相互関連または相互依存の対象を作成することを意図しています。工場で生産されたすべての製品はすべて大文字で表示されています。例えば、冷蔵庫は「冷蔵庫-A」、「冷蔵庫-B」があります。同様に、他の製品もこの番号のルールを守っています。そこで、製品の家族ツリー冷蔵庫:冷蔵庫-A、冷蔵庫-B洗濯機:洗濯機-A、洗濯機-B
//①                 ,        ,
public interface Washer{ 
//      
} 
public interface Icebox{ 
//     
} 
//②              
//   -A 
public class WasherA implements Washer{ 
   public WasherA(){ 
       System.out.println("   -A    "); 
   } 
} 
//   -B 
public class WasherB implements Washer{ 
   public WasherB(){ 
       System.out.println("   -B    "); 
   } 
} 
//  -A 
public class IceboxA implements Icebox{ 
   public IceboxA(){ 
       System.out.println("  -A    "); 
   } 
} 
//  -B 
public class IceboxB implements Icebox{ 
   public IceboxB(){ 
       System.out.println("  -B    "); 
   } 
} 
//③          ,            ,            
public interface Factory{ 
       public Washer createWasher(); 
       public Icebox createIcebox(); 
} 
//④        ,           ,   A       ,        ,    B           ,      ,                
//     A      
public class FactoryA implements Factory{ 
       //     -A 
       public Washer createWasher(){ 
            return new WasherA(); 
       } 

       //    -A 
       public Icebox createIcebox(){ 
            return new IceboxA(); 
       } 
} 

//     B      
public class FactoryB implements Factory{ 
       //     -B 
       public Washer createWasher(){ 
            return new WasherB(); 
       } 

       //    -B 
       public Icebox createIcebox(){ 
            return new IceboxB(); 
       } 
} 
私たちの抽象工場が完成しました。上で見られますが、工場の方法と抽象的な工場は自分の応用シーンがあり、優劣の点はありません。抽象的な工場を使う前に、まず作成した対象を体系的に分類することが重要です。良い製品分類規則は具体的な工場類の選択呼び出しと今後の拡張に明確な構想を提供します。