工厂模式

Posted 千个太阳在手中

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工厂模式相关的知识,希望对你有一定的参考价值。

工厂模式分为三种模式,分别为:

  •  简单工厂(Simple Factory)模式:又称静态工厂方法模式(Static Factory Method Pattern)
  • 工厂方法(Factory Method)模式:又称多态性工厂模式(Polymorphic Factory Pattern)或虚拟构造子模式(Virtual Construct Pattern)
  • 抽象工厂(Abstract Factory)模式:又称工具箱模式(Kit或Tookit)

下面就分别介绍一下这三种设计模式:

  1.  简单工厂模式(Simple Factory):

  简单工厂模式就是由一个工厂类根据传入的参数量,来决定创建哪一种产品类的实例。(仔细理解这句话,非常重要)

结构图:

 技术分享

上图涉及三个类:

  • 工厂类(Creator):担任工厂模式的核心。工厂类在客户端的调用下直接创建对象,它往往由一个具体类java类实现。
  • 抽象产品类(Product):具体产品类的接口或抽象类。
  • 具体产品类(ConcreteProduct):工厂方法模式所创建的任何角色都是这个角色的实例

源代码实例:

抽象产品类(Product):

Product.java:

public interface Product {
}

具体产品类(ConcreteProduct):

ConcreteProductA.java:

public class ConcreteProductA implements Product{
    public ConcreteProductA(){
        System.out.println("具体产品类A");
    }
}

ConcreteProductB.java:

public class ConcreteProductB implements Product{
    public ConcreteProductB(){
        System.out.println("具体产品类B");
    }
}

工厂类(Creator):

Creator.java:

public class Creator {
    
    public static Product factory(String which){
        if (which.equalsIgnoreCase("ConcreteProductA")) {
            return new ConcreteProductA();
        }else if (which.equalsIgnoreCase("ConcreteProductB")) {
            return new ConcreteProductB();
        }else {
            return null;
        }
    }
}

客户端:

public class Client {
    public static void  main(String[] args){
        Creator creator = new Creator();
        creator.factory("ConcreteProductB");
        creator.factory("ConcreteProductA");
        
    }
}

输出:

具体产品类B
具体产品类A

    2、工厂方法模式(Factory Method)

     工厂方法模式中核心工厂类变为一个抽象类,仅负责给出具体工厂子类必须实现的接口,不再接触哪一个产品类被实例化这种细节。

技术分享

结构中成员类和上面差不多,:

  • 抽象工厂类(Creator):为所有具体工厂类提供接口。
  • 具体工厂类(ConcreteCreator):担任这个角色是实现了抽象工厂接口的具体java类,并且受到应用程序的调用来创建产品。
  • 抽象产品(Product)
  • 具体产品(ConcreteProduct)

抽象方法将某一个产品和一个工厂进行了绑定,这是他与另外两个工厂模式的区别。下面注意看代码:源代码:

抽象产品(Product):

public interface Product {

}

 

 具体产品(ConcreteProduct)类:

ConcreProductA.java:

public class ConcreteProductA implements Product{
    public ConcreteProductA(){
        System.out.println("具体产品类A");
    }
}

 

ConcreProductB.java:

public class ConcreteProductB implements Product{
    public ConcreteProductB(){
        System.out.println("具体产品类B");
    }
}

 

抽象工厂类(Creator):

Creator.java:

public interface Creator {
    public Product factory();
}

 

具体工厂类(ConcreteCreator):

ConcreteCreatorA.java:

public class ConcreteCreatorA implements Creator{

    @Override
    public Product factory() {
        return new ConcreteProductA();
    }
}

 

ConcreteCreatorB.java:

public class ConcreteCreatorB implements Creator{
    
    @Override
    public Product factory() {
        return new ConcreteProductB();
    }
    
}

客户端:

public class Client {

    public static void main(String[] args){
        Creator creatorA = new ConcreteCreatorA();
        creatorA.factory();
        Creator creatorB = new ConcreteCreatorB();
        creatorB.factory();
    }
}

 

输出:

具体产品类A
具体产品类B

 

    3、抽象工厂模式(Abstract Factory)

  抽象工厂模式是对象的创建模式,他是工厂方法模式的进一步扩展。使用抽象工厂模式,可以创建来自不同工厂的各种产品。

技术分享

 

 

 

 

结构图中的角色:

  • 抽象工厂类(Creator)
  • 具体工厂类(ConcreteCreator)
  • 抽象产品(Product)
  • 具体产品(ConcreteProduct)

源代码:

抽象产品类(Product):

ProductA.java

public interface ProductA {
}

 

ProductB.java

public interface ProductB {
}

 

具体产品类(ConcreteProduct):

ProductA1.java

public class ProductA1 implements ProductA{
    
    public ProductA1(){
        System.out.println("具体产品A1");
    }
}

 

productA2.java、productB1.java、productB2.java与上类似,不在列出。

抽象工厂类(Creator):

Creator.java

public interface Creator {
    
    public ProductA factoryA();
    public ProductB factoryB();
}

 

 具体工厂类(ConcreteCreator):

ConcreteCreator1.java

public class ConcretCreator1 implements Creator{

    public ConcretCreator1(){
        System.out.println("具体工厂1:");
    }
    public ProductA factoryA(){
        return new ProductA1();
    }
    public ProductB factoryB(){
        return new ProductB1();
    }

}

 

ConcreteCreator2.java

public class ConcretCreator2 implements Creator{

    public ConcretCreator2(){
        System.out.println("具体工厂2:");
    }
    public ProductA factoryA() {
        return new ProductA2();
    }

    public ProductB factoryB() {
        return new ProductB2();
    }

}

 

 客户端:

public class client {
    public static void main(String[] args){
        //抽象工厂1
        Creator creator1 = new ConcretCreator1();
        creator1.factoryA();
        creator1.factoryB();
        Creator creator2 = new ConcretCreator2();
        creator2.factoryA();
        creator2.factoryB();
    }
}

 

 输出:

具体工厂1:
具体产品A1
具体产品B1
具体工厂2:
具体产品A2
具体产品B2

 

以上是关于工厂模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式学习——简单工厂模式工厂模式抽象工厂模式

设计模式简单工厂模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

设计模式学习——简单工厂模式工厂模式抽象工厂模式

设计模式工厂方法模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

设计模式-简单工厂工厂方法模式抽象工厂模式详解

C++工厂模式(简单工厂工厂方法抽象工厂)