设计模式-工厂方法模式(Factory Method)
来源:互联网 发布:网络在线英语培训 编辑:程序博客网 时间:2024/06/02 10:30
应用场景:
1.类不知道自己要创建哪一个对象
2.类用它的子类来指定创建哪个对象
3.客户需要清楚创建了哪一个对象
优点:
1、多态性:客户代码可以做到与特定应用无关,适用于任何实体类。
2、子类提供挂钩。基类为工厂方法提供缺省实现,子类可以重写新的实现,也可以继承父类的实现。-- 加一层间接性,增加了灵活性
3、连接并行的类层次结构。
4、良好的封装性,代码结构清晰。
5、扩展性好,在增加产品类的情况下,只需要适当修改具体的工厂类或扩展一个工厂类,就可“拥抱变化”。
6、屏蔽产品类。产品类的实现如何变化,调用者都不需要关心,只需关心产品的接口,只要接口保持不变,系统中的上层模块就不会发生变化。
7、典型的解耦框架。高层模块只需要知道产品的抽象类,其他的实现类都不需要关心,符合迪米特法则,符合依赖倒置原则,符合里氏替换原则。
缺点:
需要Creator和相应的子类作为factory method的载体,如果应用模型确实需要creator和子类存在,则很好;否则的话,需要增加一个类层次。
简单实现:
#include <string>
#include <iostream>
using namespace std;
//实例基类,相当于 Product(为了方便,没用抽象)
class LeiFeng
{
public:
virtual void Sweep()
{
cout<<"雷锋扫地"<<endl;
}
};
//学雷锋的大学生,相当于 ConcreteProduct
class Student: public LeiFeng
{
public:
virtual void Sweep()
{
cout<<"大学生扫地"<<endl;
}
};
//学雷锋的志愿者,相当于 ConcreteProduct
class Volenter: public LeiFeng
{
public :
virtual void Sweep()
{
cout<<"志愿者扫地"<<endl;
}
};
//工厂基类 Creator
class LeiFengFactory
{
public:
virtual LeiFeng* CreateLeiFeng()
{
return new LeiFeng();
}
};
//工厂具体类
class StudentFactory : public LeiFengFactory
{
public :
virtual LeiFeng* CreateLeiFeng()
{
return new Student();
}
};
class VolenterFactory : public LeiFengFactory
{
public:
virtual LeiFeng* CreateLeiFeng()
{
return new Volenter();
}
};
//客户端
int main()
{
LeiFengFactory *sf=new LeiFengFactory();
LeiFeng *s=sf->CreateLeiFeng();
s->Sweep();
delete s;
delete sf;
return 0;
}
- 设计模式-工厂方法模式(factory method)
- 设计模式-工厂方法模式(Factory Method)
- 【设计模式】-工厂方法模式-Factory Method
- 设计模式 工厂方法模式 factory method
- 设计模式 工厂方法模式 Factory Method
- 设计模式(1)-工厂方法(Factory Method)
- 【初学设计模式】Factory Method (工厂方法)
- 设计模式学习-Factory Method(工厂方法)
- 设计模式-工厂方法(Factory Method)
- factory method(工厂方法设计模式)
- 【设计模式】之 Factory Method 工厂方法
- 工厂方法(Factory Method)设计模式
- 深入浅出设计模式 ------ Factory Method(工厂方法)
- 设计模式------工厂方法(Factory Method)
- 设计模式之工厂方法Factory Method
- 设计模式 一 工厂方法Factory Method(工厂模式)
- 设计模式案例--工厂模式--工厂方法(factory method)
- 设计模式之一---工厂方法模式【Factory Method模式】
- 集合
- Nodejs 安装 grunt ,Webstorm grunt 配置
- http statusCode(状态码) 200、300、400、500序列
- Maven学习--------基础2
- freemarker 异常和错误显示
- 设计模式-工厂方法模式(Factory Method)
- Mac: Android studio+VirtualBox+Genymotion
- Swift学习笔记系列——(11)下标
- 去掉was管理控制台安全认证的方法
- Android Jni调用浅述
- git的实际操作用法
- php后台管理员权限相关表结构
- poj 1251 Jungle Roads(最小生成树)(基础)
- Ngui随Panel移动的滑动条,滑动条长度可变可不变