黑马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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/276653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[转]Struts 2.1发布

作者 Ian Roughley译者 崔康 发布于 2009年2月4日 上午8时13分 Struts2框架刚刚发布最新2.1版。该版本做了重大升级&#xff0c;包括重构更多代码到插件框架、通过增加convention插件减少XML配置和改进REST支持。 我采访了Musachy Barroso——该版本的一位开发人员&#xff0c…

dim private public static_PHP中const,static,public,private,protected的区别

const: 定义常量&#xff0c;一般定义后不可改变static: 静态&#xff0c;类名可以访问public: 表示全局&#xff0c;类内部外部子类都可以访问&#xff1b;private: 表示私有的&#xff0c;只有本类内部可以使用&#xff1b;protected: 表示受保护的&#xff0c;只有本类或子类…

C#图解教程 第六章 深入理解类

深入理解类 类成员 前两章阐述了9种类成员中的两种&#xff1a;字段和方法。本章将会介绍除事件(第14章)和运算符外的其他类成员&#xff0c;并讨论其特征。 成员修饰符的顺序 字段和方法的声明可以包括许多如public、private这样的修饰符。本章还会讨论许多其他修饰符。多个修…

Apache用户身份验证

原文链接&#xff1a;http://www.yylog.org/?p4830 Apache用户身份验证 在apache应用过程中&#xff0c;管理员经常需要对apache下的目录做一些限制&#xff0c;不希望所有用户都能访问该目录下的文件&#xff0c;只对指定用户访问&#xff0c;此时我们就要用到apache用户身…

携程elong相继牵手支付宝转“危”为“机”

新华网浙江频道1月16日电 自电子机票全面普及以来&#xff0c;航空公司机票直销的力度不断加强正给传统的机票代理甚至在线旅游平台带来了极大的生存压力。 而面对危机&#xff0c;在进一步丰富自身产品服务之外&#xff0c;大的在线旅行平台也终于找到对策。继eLong此前与支付…

c# 获取word表格中的内容_Java 获取、删除Word文本框中的表格

本文介绍如何来获取Word文本框中包含的表格&#xff0c;以及删除表格。程序测试环境包括&#xff1a;IDEAJDK 1.8.0Spire.Doc.jar注&#xff1a;jar导入&#xff0c;可通过创建Maven程序项目&#xff0c;并在pom.xml中配置Maven仓库路径&#xff0c;并指定Free Spire.Doc for J…

Array.prototype.reduce 的理解与实现

Array.prototype.reduce 是 JavaScript 中比较实用的一个函数&#xff0c;但是很多人都没有使用过它&#xff0c;因为 reduce 能做的事情其实 forEach 或者 map 函数也能做&#xff0c;而且比 reduce 好理解。但是 reduce 函数还是值得去了解的。 reduce 函数可以对一个数组进行…

PS抠图方法[photoshop中文教程]

PS抠图方法 一、魔术棒法——最直观的方法   适用范围&#xff1a;图像和背景色色差明显&#xff0c;背景色单一&#xff0c;图像边界清晰。   方法意图&#xff1a;通过删除背景色来获取图像。   方法缺陷&#xff1a;对散乱的毛发没有用。   使用方法&#xff1a…

我的核心技术都是从哪里学到的?如何提高成长的?分享给大家。

1997年&#xff0c;我在读黑龙江大学读大二时&#xff0c;我认识了一个内蒙古大学计算机专业毕业的一个高材生&#xff0c;那时我那朋友引导了我很多&#xff0c;他那时候在我们家那边开一个IT公司&#xff0c;他知道如何靠IT技术赚钱&#xff0c;如何靠程序等赚钱&#xff0c;…

python线性回归算法简介_Python实现的简单线性回归算法实例分析

本文实例讲述了Python实现的简单线性回归算法。分享给大家供大家参考&#xff0c;具体如下&#xff1a; 用python实现R的线性模型(lm)中一元线性回归的简单方法&#xff0c;使用R的women示例数据&#xff0c;R的运行结果&#xff1a; > summary(fit) Call: lm(formula weig…

Object/Relation Mapping 对象关系映射

对象-关系映射&#xff08;Object/Relation Mapping&#xff0c;简称ORM&#xff09;&#xff0c;是随着面向对象的软件开发方法发展而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法&#xff0c;关系数据库是企业级应用环境中永久存放数据的主流数据存储…

FastReport使用方法(C/S版)

前言 这两天群里一直有群友问一些关于FastReport的问题&#xff0c;结合他们的问题&#xff0c;在这里做一个整理&#xff0c;有不明白的可以加 FastReport 交流群 群 号&#xff1a;554714044 工具 VS2017 FastReport 开始 1.新建项目&#xff0c;添加三个按钮。预览、设计、…

如何设置Linux时区为东八区

当我们购买美国VPS或服务器的时候&#xff0c;默认情况下是美国时间。对于我们定时执行某些任务会带来麻烦&#xff0c;所以需要设置时区为东八区。登录SSH后&#xff0c;执行tzselect命令。我们这里选择亚洲5.这里选择china 9。一般选东八区&#xff08;北京&#xff0c;广东&…

python删除两个excel表中的相同元素_python筛选出两个文件中重复行的方法

查找A文件中&#xff0c;与B文件中内容不重复的内容#!usr/bin/python import sys import os字符串查找函数&#xff0c;使用二分查找法在列表中进行查询def binarySearch(value, lines): right len(lines) - 1 left 0 a value.strip() while left < right: middle int((…

求解:nhibernate2.0操作oralce提交事务时报错

代码如下: Configuration config new Configuration(); config.AddAssembly("TestCleanSnow"); ISessionFactory factory config.BuildSessionFactory(); ISession session f…

python画枫叶_python-文件的操作

一、异常 程序在运行的过程中&#xff0c;不可避免出现一些错误&#xff0c;这些错误成为异常 异常以后的代码都不会被执行 try 语句 代码块&#xff08;可能出现错误的语句&#xff09; except 异常类型 as 异常名: 代码块(出错以后执行的语句&#xff09; except 异常类型 as…

记2018年技术人一次短暂的创业

背景 2018年8月底&#xff0c;我全职加入了一家创业公司&#xff0c;具体做什么我暂时先不说吧&#xff0c;我是产品和技术负责人&#xff0c;自己出资了50w&#xff0c;大股东&#xff08;下面简称T)也就是ceo是早期阿里出身的中供销售&#xff0c;从2017年11月开始成立此公司…

如何在Apache环境下配置Rewrite规则

原文链接&#xff1a;http://faq.comsenz.com/viewnews-12 URL 静态化是一个利于搜索引擎的设置&#xff0c;通过 URL 静态化&#xff0c;达到原来是动态的 PHP 页面转换为静态化的 HTML 页面&#xff0c;当然&#xff0c;这里的静态化是一种假静态&#xff0c;目的只是提高搜…

情 人 节 快 乐

我不善于用词汇修饰我的句子&#xff0c; 我不善于用表情表达我的心情&#xff0c; 我不善于解读你那黯然的情绪&#xff0c; 我不善于去响应你小小的呼应&#xff0c; 虽然&#xff0c;你了解我&#xff0c; 你宽容于我&#xff0c; 你听我诉说&#xff0c; 你陪伴着我…

Windows 10系统安装JDK1.8与配置环境

第一步&#xff1a;下载JDK1.8 地址:https://www.oracle.com/index.html 第二步&#xff1a; 安装分两次&#xff0c;第一次是安装 jdk &#xff0c;第二次是安装 jre 。安装jdk默认的安装地址为C盘&#xff0c;安装目录 \java 之前的目录修改成你想放的目录&#xff1b;安装jr…