设计模式之三种工厂模式
2016-05-13 11:13
393 查看
/content/5014291.html
1.简单工厂模式
特点:简单工厂模式是工厂模式中最简单的一种,他可以用比较简单的方式隐藏创建对象的细节,一般只需要告诉工厂类所需要的类型,工厂类就会返回需要的产品类,但客户端看到的只是产品的抽象对象,无需关心到底是返回了哪个子类。每次添加一个产品子类都必须在工厂类中添加一个判断分支,但违背开放-封闭原则。
角色:
抽象工厂类
抽象产品类
具体产品类
2.工厂模式
特点:
每当生产一个产品时,先创建一个生产此产品的工厂。
角色:
抽象工厂类
具体工厂类
抽象产品类
具体产品类
3.抽象工厂模式
特点:工厂模式只能生产一个产品(要么苹果,要么香蕉),而抽象工厂可以一下生产一个产品族(由好多产品构成)。
角色:
抽象工厂类,其核心是包含一个产品族的相关接口。
具体工厂类
抽象产品类
具体产品类
1.简单工厂模式
特点:简单工厂模式是工厂模式中最简单的一种,他可以用比较简单的方式隐藏创建对象的细节,一般只需要告诉工厂类所需要的类型,工厂类就会返回需要的产品类,但客户端看到的只是产品的抽象对象,无需关心到底是返回了哪个子类。每次添加一个产品子类都必须在工厂类中添加一个判断分支,但违背开放-封闭原则。
角色:
抽象工厂类
抽象产品类
具体产品类
class Fruit{ public: virtual void GetFruit()=0; }; class Apple:public Fruit{ public: void GetFruit(){ cout<<"produce apples"<<endl; } }; class Pear:public Fruit{ public: void GetFruit(){ cout<<"produce pears"<<endl; } }; class FruitFactory{ public: Fruit* CreateFruit(char* p){ if(strcmp(p,"apple")==0) return new Apple; else if(strcmp(p,"pear")==0) return new Pear; else{ cout<<"NO"<<endl; return NULL; } } };
int main(){ FruitFactory* factory=new FruitFactory; Fruit* p=factory->CreateFruit("apple"); p->GetFruit(); delete p; p=factory->CreateFruit("pear"); p->GetFruit(); delete p; return 0; }
2.工厂模式
特点:
每当生产一个产品时,先创建一个生产此产品的工厂。
角色:
抽象工厂类
具体工厂类
抽象产品类
具体产品类
class Fruit{ public: virtual void GetFruit()=0; }; class Apple:public Fruit{ public: void GetFruit(){ cout<<"produce apples"<<endl; } }; class Pear:public Fruit{ public: void GetFruit(){ cout<<"produce pears"<<endl; } }; class FruitFactory{ public: virtual Fruit* CreateFruit()=0; }; class AppleFactory:public FruitFactory{ Fruit* CreateFruit(){ return new Apple; } }; class PearFactory:public FruitFactory{ Fruit* CreateFruit(){ return new Pear; } };
int main(){ FruitFactory* factory=NULL; Fruit* p=NULL; factory=new AppleFactory; p=factory->CreateFruit(); p->GetFruit(); delete factory; delete p; factory=new PearFactory; p=factory->CreateFruit(); p->GetFruit(); delete factory; delete p; return 0; }
3.抽象工厂模式
特点:工厂模式只能生产一个产品(要么苹果,要么香蕉),而抽象工厂可以一下生产一个产品族(由好多产品构成)。
角色:
抽象工厂类,其核心是包含一个产品族的相关接口。
具体工厂类
抽象产品类
具体产品类
//抽象水果 class Fruit{ public: virtual void GetFruit()=0; }; //北方产品族-------------------------------------------- class NorthApple:public Fruit{ public: void GetFruit(){ cout<<"produce Northapples"<<endl; } }; class NorthPear:public Fruit{ public: void GetFruit(){ cout<<"produce Northpears"<<endl; } }; //南方产品族---------------------------------------------------- class SouthApple:public Fruit{ public: void GetFruit(){ cout<<"produce Southapples"<<endl; } }; class SouthPear:public Fruit{ public: void GetFruit(){ cout<<"produce Southpears"<<endl; } }; //抽象工厂 class FruitFactory{ public: virtual Fruit* CreateApple()=0; virtual Fruit* CreatePear()=0; }; //北方工厂------------------------------------------------------- class NorthFruitFactory : public FruitFactory{ public: Fruit* CreateApple(){ return new NorthApple; } Fruit* CreatePear(){ return new NorthPear; } }; //南方工厂---------------------------------------------------------- class SouthFruitFactory : public FruitFactory{ public: Fruit* CreateApple(){ return new SouthApple; } Fruit* CreatePear(){ return new SouthPear; } };
int main(){ Fruit* f=NULL; FruitFactory* factory=NULL; //生产北方产品族----------------------------------------------------------- factory=new NorthFruitFactory; f=factory->CreateApple(); f->GetFruit(); delete f; f=factory->CreatePear(); f->GetFruit(); delete f; delete factory; //生产南方产品族-------------------------------------------------------------- factory=new SouthFruitFactory; f=factory->CreateApple(); f->GetFruit(); delete f; f=factory->CreatePear(); f->GetFruit(); delete f; delete factory; return 0; }
相关文章推荐
- 欢迎使用CSDN-markdown编辑器
- 在线支付文章索引(支付宝_微信_银联)
- MySQL远程连接丢失问题解决方法Lost connection to MySQL server at ‘reading initial communication packet’, system error: 0
- 任务管理器
- C++那些事儿
- 手把手教你写《雷神》游戏(二)
- 如何判断一个数是2的幂?
- 关于提高应用库的平台可移植性
- PHP问题 —— Notice: Undefined index:
- PHP问题 —— Notice: Undefined index:
- js对字符串进行编码方法总结
- iOS TextFiled 文本密码切换 光标偏移解决
- 344. Reverse String
- gulp详细入门教程
- 谈谈iOS中粘性动画以及果冻效果的实现
- 游戏植入广告获取收益
- javascript 常用实用函数。。。。。。
- java实现二分查找
- session管理
- java的五种数据类型解析