简单工厂模式

主要用于创建对象。 新加入类时。 不会影响曾经的系统代码。

核心思想是用一个工厂来依据输入的条件产生不同的类,然后依据不同类的 virtual 函数得到不同的结果.

以下以苹果手机的生产为例。模拟手机生产工厂。

苹果手机有各种不同的型号,有Iphone4、Iphone4s、Iphone5等等。

我们通过一个工厂来生产,client依据客户的需求生产不同型号的手机。

代码例如以下:

Apple.h

#pragma once
#include <iostream>class Apple
{
public:Apple();virtual ~Apple();virtual void ShowVersion() = 0;virtual void MakeCall(const std::string &num) = 0;
};

Apple.cpp

#include "Apple.h"Apple::Apple()
{
}Apple::~Apple()
{
}

Apple4.h

#pragma once
#include "Apple.h"class Apple4 : public Apple
{
public:Apple4();~Apple4();virtual void ShowVersion();virtual void MakeCall(const std::string &num);
};

Apple4.cpp

#include "Apple4.h"
#include <iostream>
#include <string>using namespace std;Apple4::Apple4()
{cout << "Apple4 Created!" << endl;
}Apple4::~Apple4()
{
};void Apple4::ShowVersion()
{cout << "I'm Apple4" << endl;
}void Apple4::MakeCall(const std::string &num)
{cout << "I'm Call num :" << num << endl;
}

Apple4s.h

#pragma once
#include "Apple.h"class Apple4s : public Apple
{
public:Apple4s();~Apple4s();virtual void ShowVersion();virtual void MakeCall(const std::string &num);
};

Apple4s.cpp

#include "Apple4s.h"
#include <iostream>
#include <string>using namespace std;Apple4s::Apple4s()
{cout << "Apple4s Created!" << endl;
}Apple4s::~Apple4s()
{
};void Apple4s::ShowVersion()
{cout << "I'm Apple4s" << endl;
}void Apple4s::MakeCall(const std::string &num)
{cout << "I'm Call num :" << num << endl;
}

AppleFactory.h

#pragma once
#include "Apple.h"
#include <string>class AppleFactory
{
public:AppleFactory();~AppleFactory();static Apple * MakePhone(const std::string &version);//声明为静态成员函数};

AppleFactory.cpp

#include "AppleFactory.h"
#include "Apple4.h"
#include "Apple4s.h"
#include <iostream>
#include <string>AppleFactory::AppleFactory()
{
}AppleFactory::~AppleFactory()
{
}Apple * AppleFactory::MakePhone(const std::string &version)
{if(version == "Apple4"){return new Apple4();}if(version == "Apple4s"){return new Apple4s();}return NULL;
}

main.cpp

#include "AppleFactory.h"
#include <iostream>int main()
{Apple * A4 = AppleFactory::MakePhone("Apple4");A4->ShowVersion();A4->MakeCall("10086");std::cout << "------------------" << std::endl;Apple * A4s = AppleFactory::MakePhone("Apple4s");A4s->ShowVersion();A4s->MakeCall("10010");return 0;
}/*
执行结果:Apple4 Created!
I'm Apple4
I'm Call num :10086
------------------
Apple4s Created!
I'm Apple4s
I'm Call num :10010
请按随意键继续. . .
*/

这个模式也叫静态工厂模式,由于依赖的是工厂类中的静态方法。

转载于:https://www.cnblogs.com/yangykaifa/p/6883144.html

设计模式C++实现_2_简单工厂模式相关推荐

  1. 设计模式C#描述之——简单工厂模式、抽象工厂模式、单例与多例模式

    设计模式C#描述之--简单工厂模式 前 言:设计模式是软件开发领域的精髓之一.学好设计模式是目前每一个开发人员的必修课.目前关于设计模式的书很多,其中比较好的有GOF那本的中译本,但并 不很适合初学者 ...

  2. 设计模式(1)--简单工厂模式、策略模式

    设计模式(1)--简单工厂模式.策略模式 1. 简单工厂模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static ...

  3. 设计模式(4)—— 简单工厂模式(Simple Factory,创建型)

    1.概述 使用设计模式可以提高代码的可复用性.可扩充性和可维护性.简单工厂模式(Simple Factory Pattern)属于创建型模式.简单工厂模式,由一个工厂对象决定创建出哪一种产品类的实例, ...

  4. 设计模式(0)简单工厂模式

    0 设计模式基础 0.0 设计模式的定义 先来看一下设计模式常见的书面定义: 设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他 ...

  5. [设计模式] ------ 对比总结:简单工厂模式、工厂方法模式、抽象工厂模式

    三个概念: 简单工厂模式:就是一个简单的工厂类,根据不同的入参类型,返回不同的父类引用的子类对象. 工厂方法模式:就是将生成哪个子类对象的过程,延迟到工厂子类实现,工厂父类只定义接口. 抽象工厂模式: ...

  6. 设计模式再学习之简单工厂模式

    以前不明白为啥要设计模式这玩意到底有啥用呀.那么僵硬,学起来臭长.今天学了简单模式,突然发现,诶?这不是我日常运用的吗 简单工厂模式 这个模式究竟有啥用呢,我看了十章内容,觉得可以概括成一句话. 在一 ...

  7. 设计模式(二)简单工厂模式

    一.虽然简单工厂模式不属于23种设计模式之一,但还是有用武之地. 工厂相当于一个中介,我们只需要往里传入参数.而不需要关心工厂具体怎么创建对象,这就实现客户端和具体实现类的解耦合!比如我们要去商店买果 ...

  8. Java设计模式(二)简单工厂模式—设计模式六大原则

    文章目录 设计模式六大原则 1. 开闭原则 2. 里氏代换原则 3. 依赖倒转原则 4. 接口隔离原则 5. 迪米特法则(最少知道原则) 6. 合成复用原则 工厂设计模式 什么是工厂模式 工厂模式的好 ...

  9. 《设计模式入门》 1.简单工厂模式

    简单工厂模式(Simple Factory Pattern)不属于GoF 23种设计模式,我们通常将它作为学习其他工厂模式的入门.是由一个工厂对象决定创建出哪一种产品类的实例.简单来说就是我们抽取一个 ...

最新文章

  1. react native利用webvView嵌入h5页面以及RN与webView的通信
  2. python测试脚本截图_selenium + python实现截图并且保存图片
  3. LINQ学习笔记(9) LINQ to Objects---查询内存中对象的集合
  4. mysql mongodb 事务_认识MongoDB 4.0的新特性——事务(Transactions)
  5. 计算机辅助管理与制造,计算机辅助设计与制造,对产品的设备进行管理,完成产品加工制造...
  6. 小型oa服务器系统,大型、中小型企业OA系统实施差异对比
  7. 201871010114-李岩松《面向对象程序设计(java)》第二周学习总结
  8. 荣耀继承者android,荣耀继承者后期阵容推荐,一套万金油阵容介绍给大家
  9. 在firefox的flashgot中配置各种下载器
  10. 美国亚马逊编辑推荐的一生必读书单100本
  11. 画家唐小唐:中国水墨画的传承者与创新者
  12. java 枚举values()方法
  13. QuickBooks 2016 for Mac(财务管理软件)
  14. 重庆各大学计算机专业的录取分数线,重庆各高校历年录取分数线+王牌专业汇总!填报志愿必看!...
  15. springboot+基于Java的果蔬产品销售系统 毕业设计-附源码131110
  16. Spring-Cloud-Gateway 源码解析-转自芋道源码
  17. Opencv之答题卡识别判卷
  18. 源码看JAVA【十一】Thread
  19. Spring Boot + WebSocketClient + wss协议证书认证 + 客户端心跳重连机制
  20. 软考发的是职业证书,还是执业证书?

热门文章

  1. 调用Android自带日历功能(日历列表单、添加一个日历事件)
  2. 求职,北京,.netGIS
  3. Sps的content menu 和 smart-tag的问题
  4. 好象现在才开始热爱生活了
  5. 让模型实现“终生学习”,佐治亚理工学院提出Data-Free的增量学习
  6. DAS 2020 诚征论文及赞助!
  7. 格灵深瞳发起 AI · 爱 算法 在线编程挑战赛
  8. 3D建模如何学习,小白6个月入门工作?3D建模要学多久才能接外包私活?
  9. 民办大学计算机专业教师,干货!民办大学和独立院校教师创新排行榜,这五个高校最亮眼...
  10. PyTorch | torch.zeros()如何使用?torch.zeros使用方法 | torch.zeros()例子