抽象的なパターン


関連クラスまたは依存オブジェクトのファミリーを作成するためのインターフェイスを提供します.

参加者

  • AbstractFactory:抽象的な製品を作成する操作のインターフェイスを宣言します.
  • 具体的には、具体的な製品オブジェクトを作成する操作を実装します.
  • AbstractProduct :製品オブジェクトの型のインターフェイスを宣言します.
  • 製品:対応する具体的な工場が作成する製品オブジェクトを定義します.抽象化インターフェイスを実装します.
  • クライアント:AttributFactoryとAbstractProductsクラスで宣言されたインターフェイスを使用します.
  • コード


    public class Main {
    
        public static void main(String[] args) {
            // Abstract factory #1
            AbstractFactory factory1 = new ConcreteFactory1();
            Client client1 = new Client(factory1);
            client1.run();
    
            // Abstract factory #2
            AbstractFactory factory2 = new ConcreteFactory2();
            Client client2 = new Client(factory2);
            client2.run();
        }
    }
    
    public interface AbstractFactory {
    
        AbstractProductA createProductA();
    
        AbstractProductB createProductB();
    
    }
    
    public class ConcreteFactory1 implements AbstractFactory {
    
        @Override
        public AbstractProductA createProductA() {
            return new ProductA1();
        }
    
        @Override
        public AbstractProductB createProductB() {
            return new ProductB1();
        }
    
    }
    
    public class ConcreteFactory2 implements AbstractFactory {
    
        @Override
        public AbstractProductA createProductA() {
            return new ProductA2();
        }
    
        @Override
        public AbstractProductB createProductB() {
            return new ProductB2();
        }
    
    }
    
    public interface AbstractProductA {
    
    }
    
    public interface AbstractProductB {
        void interact(AbstractProductA a);
    }
    
    public class ProductA1 implements AbstractProductA {
    
    }
    
    public class ProductB1 implements AbstractProductB {
    
        @Override
        public void interact(AbstractProductA a) {
            System.out.println(this.getClass().getSimpleName() + " interacts with " + a.getClass().getSimpleName());
        }
    
    }
    
    public class ProductA2 implements AbstractProductA {
    
    }
    
    public class ProductB2 implements AbstractProductB {
    
        @Override
        public void interact(AbstractProductA a) {
            System.out.println(this.getClass().getSimpleName() + " interacts with " + a.getClass().getSimpleName());
        }
    
    }
    
    public class Client {
    
        private AbstractProductA abstractProductA;
        private AbstractProductB abstractProductB;
    
        public Client(AbstractFactory factory) {
            abstractProductB = factory.createProductB();
            abstractProductA = factory.createProductA();
        }
    
        public void run() {
            abstractProductB.interact(abstractProductA);
        }
    }
    

    出力


    ProductB1 interacts with ProductA1
    ProductB2 interacts with ProductA2
    

    エディエルジュリアン61 / デザインパターン