设计模式--工厂方法

设计模式-工厂方法

意图

 定义一个创建对象的接口,让子类决定去实例化哪个类。工厂方法使得一个类的实例化延迟到子类。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。

适用性

  • 当一个类希望由它的子类来指定它所创建的对象的时候
  • 当一个类不知道它要创建的类是哪些类的时候(把创建权限转交给子类)
  • 在不指定待创建对象的具体类的情况下创建对象
    -将创建对象的职责委托给子类中的某一个的时候

结构

结构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工厂方法模式)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值