简单工厂模式

//一般来说,自己创建一个对象的方法是在自己写的业务函数中直接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相关推荐

  1. 黑马C++设计模式1

    设计模式的基础是:多态. 设计模式综览表: 单例模式:是保证一个类仅有一个实例,并提供一个访问它的全局访问点. 简单工厂模式:通过专门顶一个一个类来负责创建其它类的实例,被创建的实例通常都具有共同的父 ...

  2. 设计模式 - 软件设计的七大原则

    文章目录 前言 1. 软件设计模式原则 2. 开闭原则 1. 概念 2. 例子 3. 里氏替换原则 1. 概念 2. 例子 4. 依赖倒置原则 1. 概念 2. 代码 5. 单一职责原则 说明 6. ...

  3. 软件设计师提纲+复习资料整理(上午题)

    文章目录 软件设计师考试大纲 上午题(选择题) 一.计算机组成原理 考点:CPU结构组成 考点:原码.反码.补码定点整数范围 考点:浮点数表示 考点:RISC和CISC计算机的区别 考点:奇校验与偶校 ...

  4. 【黑马程序员】23种设计模式——UML图

    文章目录 前言 二.UML图 1)类图概述 2)类图的作用 3)类图表示法 1.类的表示方式 2.类与类之间关系的表示方式 2.1关联关系 ①单向关联 ②双向关联 ③自关联 2.2聚合关系 2.3组合 ...

  5. 黑马程序员,黑马论坛--------枚举和单例设计模式的区别

    文章来源:黑马程序员,黑马论坛 枚举和单例设计模式的区别,黑马面试有的 public class Test11 { public static void main(String[] args) {   ...

  6. 黑马程序员-JAVA基础-IO流中的装饰设计模式

    ------- android培训.java培训.期待与您交流!------- 装饰设计模式: 当想要对已有的对象进行功能增强时,可以定义类,将已有的对象传入,基于已有的功能,并提供加强功能.那么,自 ...

  7. 黑马程序员:java基础之装饰设计模式

    一.什么是装饰设计模式 当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能,那么自定义的类成为装饰类. 装饰类通常会通过构造方法,传递进来一个需要装饰的对象, ...

  8. 黑马程序员-面向对象-06天-5(单例设计模式)

    package java06;/** 设计模式:解决某一类问题最行之有效的方法.* java中23种设计模式:* 单例设计模式:解决一个类在内存只存在一个对象.* 想要保证对象唯一.* 1,为了避免其 ...

  9. 黑马程序员------毕老师视频笔记第七天------面向对象(模板方法设计模式)

    ---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 模板方法设计模式:定义功能时,功能的一部分是确 ...

最新文章

  1. XPath与多线程爬虫
  2. 优化系统后VS启动不了问题的一种解决方案
  3. Docker 公司是如何做社区的?
  4. Source Insight 基本使用(1)-使用Source Insight查看Android Framework 源码
  5. 使用流光法实现物体跟踪
  6. 《软件工程课程总结》
  7. 首发:徐亦达老师的机器学习课件及下载(中文目录)
  8. iOS 学习之NSPredicate
  9. 数据库:mongodb与关系型数据库相比的优缺点zz (转)
  10. 可能是迄今为止最好的GitHub代码浏览插件--赞
  11. 在Windows Azure平台上部署服务
  12. 手游中控台多开脚本实战
  13. mysql数据库的简单查询一般是查询什么,MySQL的简单查询语句(十五)
  14. 《洛杉矶时报》:失去李开复的Google,中国之路更艰难
  15. 从全球顶级数据库大会 SIGMOD 看数据库发展趋势
  16. 省心又省力的华为云等保安全服务----助力企业等保快速通过
  17. TCP与UDP 的区别
  18. Messaging——Solace PubSub+
  19. 高级软件工程第四次作业:东理三剑客团队项目
  20. 车载以太网 - SomeIP - 总纲

热门文章

  1. python可视化界面编程 pycharm_pycharm开发一个简单界面和通用mvc模板(操作方法图解)...
  2. php静态地图api,静态图API | 百度地图API SDK
  3. volatile关键字和AtomicInteger
  4. ajax 小木虫,NIST数据库中Acc. 是什么 小木虫
  5. SQLServer数据库实例相关知识笔记
  6. 计算机网络基础:网络标准相关知识介绍
  7. Asp.Net操作Cookie总结
  8. dhcp 续约review报文_Linux的私房菜 DHCP
  9. 苹果计算机磁盘格式,苹果电脑如何完全写入NTFS格式磁盘
  10. STM32 PWM输出实验