黑马C++设计模式2
简单工厂模式
//一般来说,自己创建一个对象的方法是在自己写的业务函数中直接new一个对象出来//但是现实需求,我不想创建对象,我只想拿来用。(创建类的步骤比较复杂) //好处,1、客户端和具体实现类解耦。2、对于某些对象创建过程比较复杂情况,我们不用考虑这些了。//坏处,1、简单工厂模式,增加新的功能是通过源代码实现的,不符合开闭原则。2、这个类的职责过重,这个类发生问题,会影响很多使用这个工厂模块。//抽象水果 class AbstractFruit{ public: virtual void ShowName() = 0; };//苹果 class Apple:public AbstractFruit{ public:virtual void ShowName(){cout << “我是苹果!” << endl;}};//鸭梨 class Pear:public AbstractFruit{ public:virtual void ShowName(){cout << “我是鸭梨!” << endl;} };//水果工厂 class FruitFactory{ public:static AbstractFruit* CreateFruit(string flag){if(flag == "apple"){return new Apple;}else if(flag == "pear"){return new Pear;}elsereturn NULL;} };void test1(){FruitFactory* factory = new FruitFactroy;AbstractFruit* apple = factory->CreateFruite("apple");apple->ShowName();AbstracFruit* banana = factory->CreateFruite("banana");banana->ShowName();delete factory;delete apple;delete banana;}
工厂方法模式
问题,1、类的个数成倍增加,导致类越来越多,增加维护成本。
好处,1、符合开闭原则
简单工厂模式 + “开闭原则” = 工厂方法模式
优点:1,不需要记住具体类名,甚至连具体参数都不用记忆。
2,实现了对象创建和使用的分离。
3,系统的可扩展性也就变得非常好,无需修改接口和原类。
缺点:1,增加系统中类的个数,复杂度和理解度增加。
2,增加了系统的抽象性和理解难度。
//抽象水果类class AbstractFruit{ public: virtual void ShowName() = 0; };//苹果 class Apple:public AbstractFruit{ public:virtual void ShowName(){cout << “我是苹果!” << endl;}};//鸭梨 class Pear:public AbstractFruit{ public:virtual void ShowName(){cout << “我是鸭梨!” << endl;} }; //抽象工厂类class AbstractFruitFactory{public: virtual AbstractFruit* CreateFruit() = 0;} //苹果工厂class AppleFactory:public AbstractFruitFactory{public: virtual AbstracFruit* CreateFruit(){ return new Apple; }};
//鸭梨工厂class PearFactory:public AbstractFruitFactory{public: virtual AbstracFruit* CreateFruit(){ return new Pear; }};
void test(){ AbstractFruitFactory* factory = NULL; AbstractFruit* fruit = NULL; //创建一个苹果工厂 factory = new AppleFactory; fruit = factory->CreateFruit(); fruit->ShowName(); delete factory; delete fruit;
//创建一个鸭梨工厂 factory = new PearFactory; fruit = factory->CreateFruit(); fruit->ShowName(); delete factory; delete fruit;
}
简单工厂模式和工厂方法模式适用场景
简单工厂模式:
1,工厂类负责创建的对象比较少,由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
2,客户端只知道传入工厂类的参数,对于如何创建对象不太关心。
工厂方法模式
1,客户端不知道它所需要的对象的类。
2,抽象工厂类通过其子类来指定创建哪个对象。
抽象工厂模式
抽象工厂针对的是产品族,而不是产品等级结构。产品族:同一产地或者同一厂商,功能不同。产品等级:功能相同,产地或者厂商不同。
//抽象苹果 class AbstractApple{ public:virtual void ShowName() = 0; };class ChineseApple:public AbstractApple{ public:virtual void ShowName(){cout << "中国苹果" << endl;} };//美国苹果 class USAApple:public AbstractApple{ public:virtual void ShowName(){cout << "美国苹果" << endl;} };//日本苹果 class JapaneseApple:public AbstractApple{ public:virtual void ShowName(){cout << "日本苹果" << endl;} };//抽象香蕉 class AbstractBanana{ public:virtual void ShowName() = 0; };//中国香蕉 class ChineseBanana:public AbstractBanana{ public:virtual void ShowName(){cout << "中国香蕉" << endl;} };//美国香蕉 class USABanana:public AbstractBanana{ public:virtual void ShowName(){cout << "美国香蕉" << endl;} };//日本香蕉 class JapaneseBanana:public AbstractBanana{ public:virtual void ShowName(){cout << "日本香蕉" << endl;} };//抽象工厂 针对产品族 class AbstractFactory{ public:virtual AbstractApple* CreateApple() = 0;virtual AbstractBanana* CreateBanana() = 0;virtual AbstractPear* CreatePear() = 0; };//中国工厂 class ChineseFactory:public AbstracFactory{ public:virtual AbstractApple* CreateApple() {return new ChineseApple;}virtual AbstractBanana* CreateBanana(){return new ChineseBanana;}virtual AbstractPear* CreatePear(){return new ChinesePear;} };//美国工厂 class USAFactory:public AbstracFactory{ public:virtual AbstractApple* CreateApple() {return new USAApple;}virtual AbstractBanana* CreateBanana(){return new USABanana;}virtual AbstractPear* CreatePear(){return new USAPear;} };//日本工厂 class JapaneseFactory:public AbstracFactory{ public:virtual AbstractApple* CreateApple() {return new JapaneseApple;}virtual AbstractBanana* CreateBanana(){return new JapaneseBanana;}virtual AbstractPear* CreatePear(){return new JapanesePear;} };test(){AbstractFactory* factory = NULL;AbstractApple* apple = NULL;AbstractBanana* banana = NULL:AbstractPear* pear = NULL;//中国工厂factory = new ChineseFactory; apple = factory->CreateApple();banana = factory->CreateBanana();pear = factory->CreatePear();}
总结
一、简单工厂模式
我们在实例化对象的时候通常用的式New关键字,但是有了工厂,我们在声明对象的时候就可以用工厂了,用new导致代码不够灵活,用工厂来实例化对象很灵活。
优点,1,简单工厂包含必要的判断逻辑,简单工厂实现了对象的创建和使用的分离。
2,客户端无需知道所创建的具体产品类的类名,只需要具体产品类对应的参数即可。
3,在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。
缺点,1,工厂类的职责过重,简单工厂中包含逻辑判断语句,他一旦有问题,整个系统都要出问题。
2,在添加新类的时候,简单工厂就要修改,违反了开闭原则。
二、工厂方法模式
工厂方法式简单工厂的进一步的延申,这样说是因为简单工厂违反了开闭原则,而工厂方法可以完美解决这个问题。
优点,1,工厂方法用来创建类,同时隐藏了具体产品类被实例化的细节,用户只需要关注工厂,不需要关注创建的细节。
2,再增加新的运算类时不需要修改代码,只需要增加对应的工厂即可。符合开闭原则。
缺点,1,再增加新的类时,也必须增加新的工厂类,会带来额外的开销
2,抽象层的加入使得理解难度加大。
三、抽象工厂
抽象工厂模式是工厂方法的进一步延伸,由于它提供了功能更为强大的工厂类并且具备较好的可扩展性。
有缺点:抽象工厂模式增加一个产品族很简单,但是增加一个新的产品就会非常复杂。
转载于:https://www.cnblogs.com/Maurice-code/p/11608488.html
黑马C++设计模式2相关推荐
- 黑马C++设计模式1
设计模式的基础是:多态. 设计模式综览表: 单例模式:是保证一个类仅有一个实例,并提供一个访问它的全局访问点. 简单工厂模式:通过专门顶一个一个类来负责创建其它类的实例,被创建的实例通常都具有共同的父 ...
- 设计模式 - 软件设计的七大原则
文章目录 前言 1. 软件设计模式原则 2. 开闭原则 1. 概念 2. 例子 3. 里氏替换原则 1. 概念 2. 例子 4. 依赖倒置原则 1. 概念 2. 代码 5. 单一职责原则 说明 6. ...
- 软件设计师提纲+复习资料整理(上午题)
文章目录 软件设计师考试大纲 上午题(选择题) 一.计算机组成原理 考点:CPU结构组成 考点:原码.反码.补码定点整数范围 考点:浮点数表示 考点:RISC和CISC计算机的区别 考点:奇校验与偶校 ...
- 【黑马程序员】23种设计模式——UML图
文章目录 前言 二.UML图 1)类图概述 2)类图的作用 3)类图表示法 1.类的表示方式 2.类与类之间关系的表示方式 2.1关联关系 ①单向关联 ②双向关联 ③自关联 2.2聚合关系 2.3组合 ...
- 黑马程序员,黑马论坛--------枚举和单例设计模式的区别
文章来源:黑马程序员,黑马论坛 枚举和单例设计模式的区别,黑马面试有的 public class Test11 { public static void main(String[] args) { ...
- 黑马程序员-JAVA基础-IO流中的装饰设计模式
------- android培训.java培训.期待与您交流!------- 装饰设计模式: 当想要对已有的对象进行功能增强时,可以定义类,将已有的对象传入,基于已有的功能,并提供加强功能.那么,自 ...
- 黑马程序员:java基础之装饰设计模式
一.什么是装饰设计模式 当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能,那么自定义的类成为装饰类. 装饰类通常会通过构造方法,传递进来一个需要装饰的对象, ...
- 黑马程序员-面向对象-06天-5(单例设计模式)
package java06;/** 设计模式:解决某一类问题最行之有效的方法.* java中23种设计模式:* 单例设计模式:解决一个类在内存只存在一个对象.* 想要保证对象唯一.* 1,为了避免其 ...
- 黑马程序员------毕老师视频笔记第七天------面向对象(模板方法设计模式)
---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 模板方法设计模式:定义功能时,功能的一部分是确 ...
最新文章
- XPath与多线程爬虫
- 优化系统后VS启动不了问题的一种解决方案
- Docker 公司是如何做社区的?
- Source Insight 基本使用(1)-使用Source Insight查看Android Framework 源码
- 使用流光法实现物体跟踪
- 《软件工程课程总结》
- 首发:徐亦达老师的机器学习课件及下载(中文目录)
- iOS 学习之NSPredicate
- 数据库:mongodb与关系型数据库相比的优缺点zz (转)
- 可能是迄今为止最好的GitHub代码浏览插件--赞
- 在Windows Azure平台上部署服务
- 手游中控台多开脚本实战
- mysql数据库的简单查询一般是查询什么,MySQL的简单查询语句(十五)
- 《洛杉矶时报》:失去李开复的Google,中国之路更艰难
- 从全球顶级数据库大会 SIGMOD 看数据库发展趋势
- 省心又省力的华为云等保安全服务----助力企业等保快速通过
- TCP与UDP 的区别
- Messaging——Solace PubSub+
- 高级软件工程第四次作业:东理三剑客团队项目
- 车载以太网 - SomeIP - 总纲
热门文章
- python可视化界面编程 pycharm_pycharm开发一个简单界面和通用mvc模板(操作方法图解)...
- php静态地图api,静态图API | 百度地图API SDK
- volatile关键字和AtomicInteger
- ajax 小木虫,NIST数据库中Acc. 是什么 小木虫
- SQLServer数据库实例相关知识笔记
- 计算机网络基础:网络标准相关知识介绍
- Asp.Net操作Cookie总结
- dhcp 续约review报文_Linux的私房菜 DHCP
- 苹果计算机磁盘格式,苹果电脑如何完全写入NTFS格式磁盘
- STM32 PWM输出实验