Java 디자인 패턴 - 팩토리 디자인 패턴

高洛峰
풀어 주다: 2016-12-15 13:46:37
원래의
1778명이 탐색했습니다.

공장 모드: 주로 공통 인터페이스로 클래스를 인스턴스화하는 데 사용됩니다. 공장 모드는 인스턴스화해야 하는 클래스를 동적으로 결정할 수 있습니다.
팩토리 패턴의 형태
팩토리 패턴은 주로 다음과 같은 형태를 사용합니다.
1: Simple Factory.
2: 팩토리 메소드.
3: 추상 공장.

심플 팩토리
정적 팩토리라고도 하며, 세 가지 팩토리 패턴 중 가장 간단한 구조입니다. 주로 매개변수를 받아들이고 매개변수에 따라 동일한 인터페이스를 구현하는 다양한 클래스의 인스턴스를 반환하도록 결정하는 정적 메서드가 있습니다. 구체적인 예를 살펴보겠습니다.
세탁기, 냉장고, 에어컨 등을 생산하는 공장을 가정해 보겠습니다.
먼저 모든 제품에 대한 공통 제품 인터페이스를 정의해 보겠습니다.

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에는 많은 한계가 있습니다. 우선, 새로운 제품을 추가할 때마다 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(); 
    } 
}
로그인 후 복사


위에서 제품 객체 생성 팩토리 메소드와 단순 팩토리의 주요 차이점은 단순 팩토리는 제품을 생성하는 모든 기능을 하나의 클래스에 넣는 반면, 팩토리 메소드는 다른 제품을 다른 팩토리에 넣는다는 점을 코드에서 볼 수 있습니다. 팩토리 클래스 중 하나에 문제가 있어도 다른 팩토리 클래스는 서로 영향을 주지 않고 정상적으로 작동할 수 있도록 팩토리 인터페이스를 구현하는 클래스입니다. 기존 코드를 수정하지 않고 이를 달성하기 위해 팩토리 인터페이스를 구현하는 새로운 팩토리 클래스입니다. 그러나 공장 방식에도 한계가 있습니다. 즉, 우리가 직면하는 제품이 복잡한 계층 구조를 가질 때 공장에서는 가전 제품 외에도 휴대폰 제품도 생산합니다. 주요 제품군. 이 두 제품군에는 수많은 제품이 포함되어 있으며 각 제품에는 여러 모델이 있으므로 복잡한 제품 트리를 형성합니다. 이 제품군 시스템을 설계하기 위해 팩토리 메소드를 사용하는 경우 제품의 각 모델에 대해 해당 팩토리 클래스를 작성해야 합니다. 제품이 수백, 수천 개이면 해당 팩토리 클래스도 있어야 합니다. 이로 인해 전설적인 클래스 폭발이 발생했으며, 이는 향후 유지 관리에 있어서 재앙일 뿐입니다...

추상 팩토리(Factory Method)
추상 팩토리: 의도는 일련의 상호 연관되거나 상호 의존적인 개체를 만드는 것으로 구성됩니다. <>
개인적으로 추상 팩토리는 팩토리 메소드를 기반으로 카테고리 관리라는 개념을 도입한 것이라고 생각합니다....
팩토리 메소드는 제품을 만드는 데 사용되며, 분류 없음 추상 공장의 개념은 일련의 제품을 만드는 데 사용되므로 제품 분류는 추상 공장의 초점이 되었습니다.
계속해서 위의 예를 사용하여 설명하겠습니다.
공장에서 생산되는 모든 제품은 사용됩니다. 예를 들어, 냉장고에는 "냉장고-A"와 "냉장고-B"가 있습니다. 마찬가지로 다른 제품도 이 번호 지정 규칙을 따르므로 제품 가계도가 있습니다.

냉장고:

냉장고-A

냉장고-B

세탁기:

세탁기-A

세탁 machine -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(); 
}
로그인 후 복사


다음으로 특정 Factory 클래스를 생성합니다. 위 제품의 인터페이스에서 모델 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(); 
       } 
}
로그인 후 복사


这样,我们的抽象工厂就完成了。有上面可以看出,在运用上我觉得工厂方法和抽象工厂,都有自己的应用场景,并没有什么优劣之分,但在应用抽象工厂之前,要先对创建的对象进行系统的分类,这点很重要,好的产品分类规则能为具体工厂类的选择调用和以后的扩展提供清晰的思路.


更多Java设计模式—工厂设计模式相关文章请关注PHP中文网!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!