【设计模式】工厂模式
来源:互联网 发布:我知故我在什么意思 编辑:程序博客网 时间:2024/06/02 19:42
工厂模式大致可以分为三类:
1、简单工厂模式
2、工厂方法模式
3、抽象工厂模式。
这三种模式逐步抽象,并且更具有一般性。
工厂模式有一种非常形象的描述,建立对象的类就像一个工厂,而需要被建立的对象就是一个个产品,在工厂中加工产品,使用产品的人不用关心产品是如何生产出来的。在软件中使用工厂模式的好处就是降低了模块之间的耦合。
一、简单工厂模式
只要告诉工厂所需要的产品类型,工厂就会返回需要的产品对象
举例:现在有一个工厂生产A,B两种类型的产品。使用工厂模式设计就是有一个工厂
类Factory,可以根据输入的类型(typeA,typeB)从而创建相应的A类型对象,B类型对象。
#include<iostream>using namespace std;enum{ typeA, typeB,};class product{public: virtual void show()=0;};class productA:public product{public: virtual void show() { cout<<"product A"<<endl; }};class productB:public product{public: virtual void show() { cout<<"product B"<<endl; }};class Factory{public:static product* CreateProduct(int type){ switch(type) { case typeA: return new productA(); break; case typeB: return new productB(); break; } }};int main(){ Factory f; product *a=f.CreateProduct(typeA); product *b=f.CreateProduct(typeB); a->show(); b->show(); return 0;}
代码如上所示,可以看到使用简单工厂模式的话统一了创建对象的接口,隐藏了创建对象的细节,只要知道产品的类型就可以创建出产品对象。
但是简单工厂模式不易对产品进行扩展,比如现在又出来了一种C类型的产品,那要修改的地方就很多了,首先要添加一个C类型的产品类,还有在工厂类中再添加一个分支,这违背了开闭原则。
说白了,你的产品和工厂还是没有完全解耦,绑定在一起的。
简单工厂通过构造时传入的标识来生产产品,不同产品都在同一个工厂中生产,这种判断会随着产品的增加而增加,给扩展和维护带来麻烦
二、工厂方法模式
工厂模式,在简单工厂模式的基础上,对工厂添加了一个抽象层,将工厂的动作抽象出来,作为抽象类,而具体的行为由工厂类的子类去实现,让工厂类的子类去决定生成什么类型的产品。
举例:现在有一个工厂生产A,B两种类型的产品。
与简单工厂类似,首先定义一个基类抽象产品类,定义两个产品类A和B继承基类产品。
在此基础上,再定义个抽象工厂类,定义两个工厂类继承基类抽象工厂,各自实现创建产品。
#include<iostream>using namespace std;class product{public: virtual void show()=0;};class productA:public product{public: virtual void show() { cout<<"product A"<<endl; }};class productB:public product{public: virtual void show() { cout<<"product B"<<endl; }};class Factory{public: virtual product* CreateProduct()=0;};class FactoryA:public Factory{public: virtual product* CreateProduct() { return new productA(); }};class FactoryB:public Factory{public: virtual product* CreateProduct() { return new productB(); }};int main(){ Factory* FA=new FactoryA(); product* a=FA->CreateProduct(); a->show(); Factory* FB=new FactoryB(); product* b=FB->CreateProduct(); b->show(); return 0;}
优点:当再增加一个产品类C时,不必修改原来的代码,只需要再增加一个新的工厂子类就ok
缺点:生产的产品种类单一,只为一种品牌的产品提供接口。
比如说,工厂模式只能生产华为的手机和电脑,不能生产苹果手机和电脑。
三、抽闲工厂模式
一个工厂生产多种产品,它们是一个产品族,不同的产品族的产品派生于不同的抽象产品(或产品接口)。
举例:华为工厂生产华为的手机和电脑,苹果工厂生产苹果的手机和电脑。
代码实现:
(1)定义一个抽象手机类,再定义华为的手机类和苹果的手机类继承基类抽象手机类;
(2)定义一个抽象电脑类,再定义华为的电脑类和苹果的电脑类继承基类抽象电脑类;
(3)定义一个工厂抽象基类,再定义华为的工厂类继承基类工厂,实现创建华为的手机和电脑;定义苹果的工厂类继承基类的工厂,实现创建苹果的手机和电脑。
优缺点:
抽象工厂模式封装了产品的创建,只要我们知道工厂就可以创建出一组产品。但是缺点也很明显,比如新增一个产品,要在每个工厂中再添加一种方法,违反了开闭原则。
- 设计模式------工厂模式
- 设计模式------工厂模式
- 设计模式 [ 工厂模式 ]
- 设计模式--工厂模式
- 设计模式-工厂模式
- 设计模式--工厂模式
- 设计模式 工厂模式
- 设计模式-工厂模式
- 设计模式 -- 工厂模式
- 设计模式-工厂模式
- 设计模式----工厂模式
- 设计模式---工厂模式
- 设计模式-工厂模式
- 设计模式--工厂模式
- 设计模式---工厂模式
- 设计模式-工厂模式
- 设计模式--工厂模式
- 设计模式 - 工厂模式
- Oracle 游标使用全解
- Android序列化
- js禁用上下文菜单的代码
- MavenArchiver.getManifest问题
- HTML5新特性教程免费分享
- 【设计模式】工厂模式
- 创建本地的yum
- Android Studio导入工程报错[Plugin with id 'com.android.application' not found]
- 面向对象有哪些特征
- 八皇后问题(递归,回溯)
- 第四章 Android 四大应用组件
- 【学习摘记】马士兵Servlet&JSP_课时19_JSP_HelloWorld——JSP初见
- python相关的博客以及网站(记录学习的点点滴滴,回顾时清清楚楚)
- web开发第七课用户登录