단순 공장, 공장 방법 과 추상 공장

머리말
디자인 모델 을 배우 기 전에 대상 을 대상 으로 하 는 디자인 원칙 의 6 원칙 1 법칙 을 먼저 배 울 수 있다. 그들 은 디자인 모델 과 서로 표리 가 되 고 일맥상통 한다.또한 공장 디자인 모델 은 Spring 소스 코드, JDK 소스 코드, 실제 생산 공정 에 도 널리 활용 된다.
단순 공장
적용 범위: 여러 곳 에서 '공 통 된 특징 이 있 는' 인 스 턴 스 를 만들어 야 할 때 구체 적 으로 실현 한다. 한 가지 대상 의 실례 를 한 공장 에 두 고 공장 소지 자가 인 스 턴 스 를 만들어 야 할 때 공장 대상 에 게 가 져 가면 된다. 구체 적 인 공장 대상 이 몇 가지 인 스 턴 스 를 제공 할 수 있 는 지, 인 스 턴 스 의 생 성 과정 에 어떤 복잡 한 조작 이 필요 한 지,공장 소유 자 는 결코 관심 을 가 질 필요 가 없다.예 를 들 어 세 가지 제품 이 있 는데 사용 자 는 콘 솔 에서 제품 유형 을 입력 한 다음 에 시스템 이 해당 모델 의 제품 으로 돌아간다.
간단 한 공장 모델 을 사용 하 는 코드 는 다음 과 같다.
package com.zenghui.factory.pattern;

import java.util.Scanner;

public class SimpleFactoryDemo {
    public static void main(String[] args) {
        SimpleFactory simpleFactory = new SimpleFactory();
        Scanner input = new Scanner(System.in);

        System.out.println("     ,    :");
        int type1 = input.nextInt();
        System.out.print("    :");
        System.out.println(simpleFactory.createProduct(type1));

        System.out.println("     ,    :");
        int type2 = input.nextInt();
        System.out.print("    :");
        System.out.println(simpleFactory.createProduct(type2));
    }

}

interface Product {
}
class ConcreteProduct implements Product {
}
class ConcreteProduct1 implements Product {
}
class ConcreteProduct2 implements Product {
}

class SimpleFactory {
    public Product createProduct(int type){
        if (type ==1 ){
            return new ConcreteProduct1();
        }else if (type == 2){
            return new ConcreteProduct2();
        }else {
            return new ConcreteProduct();
        }
    }
}

공장 모델 을 사용 하지 않 으 면 무슨 문제 가 생 길 까?
공장 모드 를 사용 하지 않 으 면 main 함수 에 두 번 의 판단 을 쓸 수 있 습 니 다. main 코드 는 다음 과 같 습 니 다.
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        Product product1;
        System.out.println("     ,    :");
        int type2 = input.nextInt();
        System.out.print("    :");
        if (type2 ==1 ){
            product1 =  new ConcreteProduct1();
        }else if (type2 == 2){
            product1 =  new ConcreteProduct2();
        }else {
            product1 =  new ConcreteProduct();
        }
        System.out.println(product1);
        
        Product product2;
        System.out.println("     ,    :");
        int type2 = input.nextInt();
        System.out.print("    :");
        if (type2 ==1 ){
            product2 =  new ConcreteProduct1();
        }else if (type2 == 2){
            product2 =  new ConcreteProduct2();
        }else {
            product2 =  new ConcreteProduct();
        }
        System.out.println(product2);
    }

여기에 코드 의 중복 이 나 타 났 고 같은 논리 적 인 코드 는 두 번 썼 다.문 제 는:
  • 코드 가 지루 하고 똑 같은 논 리 를 여러 번 썼 으 며 세 번 을 넘 지 않 으 면 재 구성
  • 1 개 제품 추가 시 여러 곳 수정 필요
  • 최소 지식 원칙, 단일 직책 원칙
  • 에 위배 된다.
    공장 방법
    공장 방법 은 사실 계승 과 다 태 적 인 응용 이다.OOP 특성 - 계승, 부모 클래스 의 코드 를 OOP 특성 - 다 중 으로 재 활용 하여 방법 을 동적 으로 연결 할 수 있 습 니 다.
    package com.zenghui.factory.pattern;
    
    public class FactoryMethodDemo {
       public static void main(String[] args) {
           System.out.println("    1,   :");
           Factory concreteFactory1 = new ConcreteFactory1();
           Factory concreteFactory2 = new ConcreteFactory2();
           Product product = concreteFactory1.factoryMethod();
           concreteFactory1.createAndWrap();
           System.out.println();
           System.out.println("    2,   :");
           concreteFactory2.createAndWrap();
       }
    }
    
    
    abstract class Factory{
       abstract Product factoryMethod();
    
       public void createAndWrap(){
           Product product = factoryMethod();
           System.out.println("    :" + product);
           System.out.println("。。。。    !");
       }
    }
    
    class ConcreteFactory extends Factory {
       public Product factoryMethod() {
           return new ConcreteProduct();
       }
    }
    class ConcreteFactory1 extends Factory {
       public Product factoryMethod() {
           return new ConcreteProduct1();
       }
    }
    class ConcreteFactory2 extends Factory {
       public Product factoryMethod() {
           return new ConcreteProduct2();
       }
    }
    

    공장 방법 을 사용 하지 않 으 면 무슨 문제 가 생 길 까?
    공장 방법 을 사용 하지 않 으 면 각 Factory 의 자 류 는 한 번 씩 createAndWrap() 방법 을 써 야 한다.
    추상 공장
    추상 적 인 공장 은 간단 한 공장 과 공장 방법의 결합 과 같다.그 는 단순 공장 처럼 다른 대상 을 만 들 수 있다.그 는 공장 방법 처럼 추상 류 를 계승 하여 자 류 공장 을 서로 다른 실현 을 하 게 했다.
    추상 적 인 공장 의 역할 은 서로 다른 계열 의 제품 을 만 드 는 것 이다. 예 를 들 어 제품 을 1 시리즈 와 2 시리즈 로 나 누 는 것 이다.
    package com.zenghui.factory.pattern;
    
    public class AbstractFactoryDemo {
       public static void main(String[] args) {
           AbstractFactory abstractFactory = new ConcreteFactoryD1();
           AbstractProductA productA = abstractFactory.createProductA();
           AbstractProductB productB = abstractFactory.createProductB();
           // do something with productA and productB
       }
    }
    
    class AbstractProductA {
    }
    class AbstractProductB {
    }
    class ProductA1 extends AbstractProductA {
    }
    class ProductA2 extends AbstractProductA {
    }
    class ProductB1 extends AbstractProductB {
    }
    class ProductB2 extends AbstractProductB {
    }
    abstract class AbstractFactory {
       abstract AbstractProductA createProductA();
       abstract AbstractProductB createProductB();
    }
    class ConcreteFactoryD1 extends AbstractFactory {
       AbstractProductA createProductA() {
           return new ProductA1();
       }
    
       AbstractProductB createProductB() {
           return new ProductB1();
       }
    }
    class ConcreteFactoryD2 extends AbstractFactory {
       AbstractProductA createProductA() {
           return new ProductA2();
       }
    
       AbstractProductB createProductB() {
           return new ProductB2();
       }
    }
    

    좋은 웹페이지 즐겨찾기