设计模式-工厂方法
意图
定义一个创建对象的接口,让子类决定去实例化哪个类。工厂方法使得一个类的实例化延迟到子类。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
适用性
- 当一个类希望由它的子类来指定它所创建的对象的时候
- 当一个类不知道它要创建的类是哪些类的时候(把创建权限转交给子类)
- 在不指定待创建对象的具体类的情况下创建对象
-将创建对象的职责委托给子类中的某一个的时候
结构
结构1:提供了创建对象的接口
结构2:把对象的创建放到子类中实现:Factory 中只是提供了对象创建的接口,其实现将放在 Factory 的子类ConcreteFactory 中进行
结构3:
代码示例:
//抽象产品类
class Product {};
#ifdef Implementation1
//多种产品继承抽象产品类
class MyProduct : public Product {};
class YourProduct : public Product {};
class TheirProduct : public Product {};
typedef int ProductId;
const int MINE = 1;
const int YOURS = 2;
const int THEIRS = 2;
/*
*/
//生产产品抽象类
class Creator {
public:
//提供生产产品的虚函数,返回生产的产品
virtual Product* Create(ProductId);
};
/*
*/
//根据类的特征提供生产产品的情况
Product* Creator::Create (ProductId id) {
if (id == MINE) return new MyProduct;
if (id == YOURS) return new YourProduct;
// repeat for remaining products...
return 0;
}
/*
*/
class MyCreator : public Creator {
public:
virtual Product* Create(ProductId);
};
/*
*/
//具体生产者提供具体的生产
Product* MyCreator::Create (ProductId id) {
if (id == YOURS) return new MyProduct;
if (id == MINE) return new YourProduct;
// N.B.: switched YOURS and MINE
if (id == THEIRS) return new TheirProduct;
return Creator::Create(id); // called if all others fail
}
应用
计算器的设计
1.简单工厂
//用来生产运算符类
class OperationFactory{
public static Operation createOperation(String operate){
Operation mOperation = null;
switch (operate){
case "+":mOperation = new OperationAdd();break;
case "-":mOperation = new OperationSub();break;
case "*":mOperation = new OperationMul();break;
case "/":mOperation = new OperationDiv();break;
}
return mOperation
}
}
//客户端的代码:
Operation oper=null;
oper = OperationFactory.createOperation("+");
oper.Number1 = 100;
oper.Number2 = 200;
double result = oper.getResult();
2.工厂方法
//先创建一个工厂接口:
interface IFactory{
Operation createOperation();
}
//然后,加减乘除各创建一个具体工厂来实现这个接口:
class AddFactory :IFactory{
public Operation createOperation(){
return new OperationAdd();
} }
class SubFactory :IFactory{
public Operation createOperation(){
return new OperationSub();
} }
class MulFactory :IFactory{
public Operation createOperation(){
return new OperationMul();
} }
class DivFactory :IFactory{
public Operation createOperation(){
return new OperationDiv();
} }
//客户端的实现代码:
IFactory operFactory = new AddFactory();
Operation oper = operFactory.createOperation();
oper.number1 =100;
oper.number2 =200;
double result = oper.getResult();
参考
设计模式 工厂方法模式 factory method
设计模式(c++)笔记之一(Factory Method工厂方法模式)