[デザインパターンノート]抽象ファクトリパターン

ギガファクトリーの周りに他のファクトリーを作成します。ギガファクトリーは他の工場の工場としても知られています。

オブジェクトを作成するための最適な方法を提供します。

抽象ファクトリパターンでは、インターフェイスは、クラスを明示的に指定する必要なしに、関連オブジェクトの作成を担当するファクトリです。

生成された各ファクトリは、ファクトリパターンに従ってオブジェクトを提供できます。

目的:具体的なクラスを指定せずに、一連の関連オブジェクトまたは相互依存オブジェクトを作成するためのインターフェースを提供すること

問題を解決する:主にインターフェイス選択の問題を解決します

キーコード:同じタイプの複数の製品を1つの工場に集約する


AbstractFactory {
    getA;
    getB;

}

AFactory extends AbsFactory{getA,getB};
BFactory extends AbsFactory{getA,getB};

AbstractFactory Afactory=FactoryProducer.getFactory("A");
A a=Afactory.getA;

AbstractFactory Bfactory=FactoryProducer.getFactory("B");
B b=Bfactory.getB;

 

利点:製品ファミリの複数のオブジェクトが連携して動作するように設計されている場合、クライアントは常に同じ製品ファミリのオブジェクトのみを使用することが保証されます。

短所:製品ファミリーを拡張することは非常に困難です。特定の製品をシリーズに追加するには、抽象Creatorにコードを追加し、特定の製品にコードを追加する必要があります。

使用シナリオ: QQスキンの変更、セット全体の変更

ケースコード:

シェイプインターフェイスを作成します。

public interface Shape {
    void draw();
}

形状実装クラス:

public class Circle implements Shape{
    @Override
    public void draw() {
        System.out.println("circle draw");
    }
}
public class Rectangle implements Shape{
    @Override
    public void draw() {
        System.out.println("rectangle draw");
    }
}
public class Square implements Shape{
    @Override
    public void draw() {
        System.out.println("Square draw");
    }
}

色のインターフェイスを作成します。

public interface Color {
    void fill();
}
public class Red implements Color{
    @Override
    public void fill() {
        System.out.println("red fill");
    }
}
public class Blue implements Color{
    @Override
    public void fill() {
        System.out.println("Blue fill");
    }
}
public class Green implements Color{
    @Override
    public void fill() {
        System.out.println("Green fill");
    }
}

工場を取得するために、色と形状のオブジェクトの抽象クラスを作成します。

public abstract class AbstractFactory {
    public abstract Color getColor(String color);
    public abstract Shape getShape(String shape);
}

抽象ファクトリクラスを継承し、指定された情報に基づいてエンティティクラスオブジェクトを生成します

public class ShapeFactory extends AbstractFactory{
    @Override
    public Color getColor(String color) {
        return null;
    }

    @Override
    public Shape getShape(String shape) {
        if(shape==null)return null;
        if(shape.equalsIgnoreCase("circle")){
            return new Circle();
        }else if(shape.equalsIgnoreCase("rectangle")){
            return new Rectangle();
        }else if(shape.equalsIgnoreCase("square")){
            return new Square();
        }
        return null;
    }
}
public class ColorFactory extends AbstractFactory{
    @Override
    public Color getColor(String color) {
        if(color==null)return null;
        else if(color.equalsIgnoreCase("red")){
            return new Red();
        }else if(color.equalsIgnoreCase("green")){
            return new Green();
        }else if(color.equalsIgnoreCase("blue")){
            return new Blue();
        }
        return null;
    }
    @Override
    public Shape getShape(String shape) {
        return null;
    }
}

形状または色の情報を渡してファクトリを取得するファクトリクリエータ/ジェネレータクラスを作成します

public class FactoryProducer {
    public static AbstractFactory getFactory(String choice){
        if(choice.equalsIgnoreCase("shape")){
            return new ShapeFactory();
        }else if(choice.equalsIgnoreCase("color")){
            return new ColorFactory();
        }
        return null;
    }
}

テスト:

public class AbstractFactoryPattrnDemo {
    public static void main(String[] args) {
        AbstractFactory shape = FactoryProducer.getFactory("shape");
        shape.getShape("circle").draw();
        shape.getShape("rectangle").draw();
        shape.getShape("square").draw();

        AbstractFactory color = FactoryProducer.getFactory("color");
        color.getColor("red").fill();
        color.getColor("green").fill();
        color.getColor("blue").fill();
    }
}

おすすめ

転載: blog.csdn.net/m0_52043808/article/details/124091955