抽象ファクトリモード(Abstract Factory)-作成タイプ


意図
クライアントが製品の特定のタイプを指定する必要がない場合、複数の製品ファミリーの1つを作成します.
ファミリー
製品.
プロダクトファミリーとは、関連するまたは相互に依存する一連のプロダクトからなるファミリーです.
抽象ファクトリモードの構造
クラス図とロール
ファクトリインタフェース(Factory):すべての特定のファクトリで実装する必要があるインタフェース.各タイプの製品に対して少なくとも1つの工場メソッドを定義します.
具体的な工場(Concrete Factory):"Factoryインタフェースの実装.
製品インタフェース(Product):すべての特定の製品が実現しなければならないインタフェース.各製品は、製品インタフェースを定義します.
具体的な製品(Concrete Product):製品インタフェースの実現.
//     
interface Engine{}//  
interface Wheel{}//  
//    
class ChinaEngine implements Engine{}
class GermanyEngine implements Engine{}

class ChinaWheel implements Wheel{}
class AmericaWheel implements Wheel{}

//     
interface Manufacturer{//   
    public Engine getEngine();
    public Wheel getWheel();
}
//     
class DZManufacturer implements Manufacturer{//       
    @Override
    public Engine getEngine(){
        return new ChinaEngine();
    }
     @Override
    public Wheel getWheel(){
        return new ChinaWheel();
    }
}
//     
class BMManufacturer implements Manufacturer{//       
    @Override
    public Engine getEngine(){
        return new GermanyEngine();
    }
     @Override
    public Wheel getWheel(){
        return new AmericaWheel();
    }
}
//     
class test  {
	public static void main (String[] args) throws java.lang.Exception	{
	    Manufacturer manu=new DZManufacturer();
	    Car dz=new Car();
	    dz.setEngine(manu.getEngine());
	    dz.setWheel(manu.getWheel());
	    manu=new BMManufacturer();
	    System.out.println("            :"+dz);
	    Car bm=new Car();
	    bm.setEngine(manu.getEngine());
	    bm.setWheel(manu.getWheel());
	    System.out.println("            :"+bm);
	}
}
class Car {
    private Engine engine;
    private Wheel wheel;
    public Engine getEngine(){
        return this.engine;
    }
    public void setEngine(Engine engine){
        this.engine=engine;
    }
    public Wheel getWheel(){
        return this.wheel;
    }
    public void setWheel(Wheel wheel){
        this.wheel=wheel;
    }
    @Override 
    public String toString(){
        return "  :"+engine.getClass().getName()+"。  :"+wheel.getClass().getName();
    }
}

抽象ファクトリ適用シーン
1つのシステムは、製品クラスインスタンスがどのように作成され、組み合わせられ、表現されるかの詳細に依存してはならない.
このシステムの製品には複数の製品族があり、システムはそのうちの1族の製品だけを消費している.
同じファミリーに属する製品は一緒に適用され、この制約はシステムの設計に反映される必要がある.
システムは、すべての製品が同じインタフェースで表示され、クライアントが実装に依存しないようにする製品クラスのライブラリを提供します.