欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

工厂方法模式

程序员文章站 2022-07-14 09:25:15
...
  • 是类的创建模式, 又叫做虚拟构造子模式多态性工厂模式
  • 定义一个创建产品对象的工厂接口, 实际创建工作放在实现了工厂接口的具体工厂类中
  • 遵循了"开闭"原则, 克服了简单工厂模式的缺点

工厂方法模式涉及到4个角色:

  • 抽象工厂(Creator)角色 : 工厂方法模式的核心, 与应用程序无关. 任何创建对象的工厂类必须实现该工厂接口/抽象类.
  • 具体工厂(Concrete Creator)角色 : 实现了抽象工厂接口的具体工厂, 含有与应用密切相关的逻辑. 应用程序调用具体工厂类来创建产品对象
  • 抽象产品(Product)角色 : 产品对象的共同父类或共有接口, 实际系统中可以是接口或抽象类
  • 具体产品(Concrete Product)角色 : 实现了抽象产品角色所声明的接口, 工厂方法模式创建的每一个对象都是某个具体产品角色的实例
结构特征
  • 平行的等级结构, 即常常会采用按照产品的等级结构设计一个同结构的工厂等级结构
  • 然后由相应的工厂角色创建相应的产品角色
示例性系统
//抽象工厂接口
public interface Creator {
    //工厂方法
    public Product factory();
}

//抽象产品接口
public interface Product {
    
}

//具体工厂类1
public class ConcreteCreator1 implements Creator {
    //工厂方法
    public Product factory() {
        return new ConcreteProduct1();
    }
}

//具体工厂类2
public class ConcreteCreator2 implements Creator {
    //工厂方法
    public Product factory() {
        return new ConcreteProduct2();
    }
}

//具体产品类1
public class ConcreteProduct1 implements Product {
    public ConcreteProduct1() {
        ...
    }
}

//具体产品类2
public class ConcreteProduct2 implements Product {
    public ConcreteProduct2() {
        ...
    }
}

//客户端示例
public class Client {
    
    private static Creator creator1, creator2;
    private static Product prod1, prod2;
    
    public static void main(String[] args) {
        creator1 = new ConcreteCreator1();
        prod1 = creator1.factory();
        creator2 = new ConcreteCreator2();
        prod2 = creator2.factory();
    }
}
工厂方法模式和简单工厂模式
  • 工厂方法模式的核心是一个抽象工厂类, 而简单工厂模式的核心是一个具体工厂类
  • 工厂方法模式可以允许很多具体工厂类从抽象工厂类中继承创建行为, 从而可以成为多个简单工厂模式的综合
  • 工厂方法模式退化后很像简单工厂模式 : 如果一个系统只需要一个具体工厂类, 则将抽象工厂类合并到具体工厂类, 此时只有一个具体工厂类, 将工厂方法改为静态方法就得到了简单工厂模式
  • 两种模式的factory()方法返回的数据类型都是抽象类型Product, 客户端也不必知道所得到的产品的真实类型. 这种多态性设计将工厂类选择创建哪个、如何创建对象的细节完全封装在具体工厂类内部
  • 工厂方法模式的具体工厂类都有共同的抽象父类或共同的接口, 因此才有别名多态性工厂模式
  • 对于工厂方法模式而言, 加入一个新的产品只需要加入这个产品类及它对应的工厂类, 没有必要修改客户端, 也没有必要修改抽象工厂角色或其他已有的具体工厂角色, 因此, 工厂方法模式完全支持"开闭"原则
产品的循环使用
  • 如果产品对象可以由内部状态表征的话, 那么对于每一个可能的内部状态, 往往仅需要一个产品实例, 这时候, 此时就会用到享元模式