工厂方法模式 (Factory Method)定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其他子类。
工厂模式是一种类创建型模式 (可参考 设计模式 创建型模式)。
结构
图-工厂方法模式结构图
Product : 定义产品对象的接口。
abstract class Product {
public abstract void Use();
}
public abstract void Use();
}
ConcreteProduct : 实现 Product 接口。
class ConcreteProduct extends Product {
public ConcreteProduct() {
System.out.println("创建 ConcreteProduct 产品");
}
@Override
public void Use() {
System.out.println("使用 ConcreteProduct 产品");
}
}
public ConcreteProduct() {
System.out.println("创建 ConcreteProduct 产品");
}
@Override
public void Use() {
System.out.println("使用 ConcreteProduct 产品");
}
}
Creator : 声明工厂方法,它会返回一个产品类型的对象。 Creator 也可以实现一个默认的工厂方法 FactoryMethod() ,以返回一个默认的具体产品类型。
interface Creator {
public Product FactoryMethod();
}
public Product FactoryMethod();
}
ConcreteCreator : 覆写 Creator 中的工厂方法 FactoryMethod() 。
class ConcreteCreator implements Creator {
@Override
public Product FactoryMethod() {
return new ConcreteProduct();
}
}
@Override
public Product FactoryMethod() {
return new ConcreteProduct();
}
}
测试代码
public class FactoryMethodPattern {
public static void main(String[] args) {
Creator factory = new ConcreteCreator();
Product product = factory.FactoryMethod();
product.Use();
}
}
public static void main(String[] args) {
Creator factory = new ConcreteCreator();
Product product = factory.FactoryMethod();
product.Use();
}
}
运行结果
创建 ConcreteProduct 产品
使用 ConcreteProduct 产品
使用 ConcreteProduct 产品
动机
当一个类不知道它所必须创建的对象的类的时候。
当一个类希望由它的子类来指定它所创建的对象的时候。
当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将是代理者的帮助子类的信息局部化的时候。
要点
1、工厂模式中,增加一种产品类,就要增加一个工厂类。
因为每个工厂类只能创建一种产品的实例。
2、工厂模式遵循开放-封闭原则。
工厂模式中,新增一种产品并不需要修改原有类,仅仅是扩展。
实例
还是以 简单工厂模式 里的例子来进行说明。
如何实现一个具有加减乘除基本功能的计算器?
两种模式的 Product 和 ConcreteProduct 角色代码没有区别,不再赘述。
差异在于 Factory 角色部分,以及客户端部分,请在代码中体会。
Creator 角色
// Creator 角色,定义返回产品实例的公共工厂方法
interface OperationFactory {
public Operation FactoryMethod();
}
interface OperationFactory {
public Operation FactoryMethod();
}
ConcreteCreator 角色
和简单工厂模式相比,每一种产品都会有一个具体的工厂类负责生产实例。
// ConcreteCreator 角色,具体实现 Creator 中的方法
class AddFactory implements OperationFactory {
@Override
public Operation FactoryMethod() {
return new Add();
}
}
// ConcreteCreator 角色,具体实现 Creator 中的方法
class SubFactory implements OperationFactory {
@Override
public Operation FactoryMethod() {
return new Sub();
}
}
// ConcreteCreator 角色,具体实现 Creator 中的方法
class MulFactory implements OperationFactory {
@Override
public Operation FactoryMethod() {
return new Mul();
}
}
// ConcreteCreator 角色,具体实现 Creator 中的方法
class DivFactory implements OperationFactory {
@Override
public Operation FactoryMethod() {
return new Div();
}
}
class AddFactory implements OperationFactory {
@Override
public Operation FactoryMethod() {
return new Add();
}
}
// ConcreteCreator 角色,具体实现 Creator 中的方法
class SubFactory implements OperationFactory {
@Override
public Operation FactoryMethod() {
return new Sub();
}
}
// ConcreteCreator 角色,具体实现 Creator 中的方法
class MulFactory implements OperationFactory {
@Override
public Operation FactoryMethod() {
return new Mul();
}
}
// ConcreteCreator 角色,具体实现 Creator 中的方法
class DivFactory implements OperationFactory {
@Override
public Operation FactoryMethod() {
return new Div();
}
}
Client 角色
与简单工厂模式中无需关注具体创建不同,工厂模式中需要指定具体工厂,以负责生产具体对应的产品。
// Client 角色,需要指定具体工厂,以负责生产具体产品
public class FactoryMethodPattern {
public static void main(String[] args) {
OperationFactory factory = new SubFactory();
Operation oper = factory.FactoryMethod();
oper.numA = 3;
oper.numB = 2;
double result = oper.getResult();
System.out.println("result = " + result);
}
}
public class FactoryMethodPattern {
public static void main(String[] args) {
OperationFactory factory = new SubFactory();
Operation oper = factory.FactoryMethod();
oper.numA = 3;
oper.numB = 2;
double result = oper.getResult();
System.out.println("result = " + result);
}
}
C++版工厂方法模式
以下为一个C++版的工厂方法模式例子。
假设有两个台灯制造工厂,一个专门生产红色的灯,一个专门生产蓝色的灯。
在客户端里,我们实例化蓝灯工厂,来生产一个蓝灯。
}