设计模式C++实现_2_简单工厂模式
简单工厂模式
主要用于创建对象。 新加入类时。 不会影响曾经的系统代码。
核心思想是用一个工厂来依据输入的条件产生不同的类,然后依据不同类的 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
请按随意键继续. . .
*/
这个模式也叫静态工厂模式,由于依赖的是工厂类中的静态方法。
设计模式C++实现_2_简单工厂模式的更多相关文章
- Java设计模式(一) 简单工厂模式不简单
摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...
- 设计模式(二)简单工厂模式(Simple Factory Pattern)
一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式——简单工厂模式. 二.简单工厂 ...
- <一>读<<大话设计模式>>之简单工厂模式
工厂模式尽管简单.可是写下这篇文章却不简单. 第一:本人经过内心的挣扎后才决定開始写博文的.为什么呢,由于好长时间没有写了,对自己的文学功底也是好不自信.可是技术这东西你不写出来你真不知道自己掌握多少 ...
- Unity C# 设计模式(二)简单工厂模式
定义: 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一. 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例 ...
- Java设计模式学习笔记(二) 简单工厂模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...
- C#设计模式学习笔记:简单工厂模式(工厂方法模式前奏篇)
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7551373.html,记录一下学习过程以备后续查用. 一.引言 简单工厂模式并不属于GoF23里面的设计模式 ...
- Java设计模式(三)简单工厂模式
定义与类型 定义:由一个工厂对象决定创建出哪一种产品类的实例 类型:创建型,但不属于GOF23种设计模式 适用场景 工厂类负责创建的对象比较少 客户端(应用层)只知道传入工厂类的参数,对于如何创建对象 ...
- C# 设计模式(1)——简单工厂模式、工厂模式、抽象工厂模式
1.前言 上一篇写了设计模式原则有助于我们开发程序的时候能写出高质量的代码(牵一发而不动全身),这个系列还是做个笔记温习一下各种设计模式,下面就看看简单工厂模式.工厂模式.抽象工厂模式. 2.简单工厂 ...
- PHP设计模式(一)简单工厂模式 (Simple Factory For PHP)
最近天气变化无常,身为程序猿的寡人!~终究难耐天气的挑战,病倒了,果然,程序猿还需多保养自己的身体,有句话这么说:一生只有两件事能报复你:不够努力的辜负和过度消耗身体的后患.话不多说,开始吧. 一.什 ...
随机推荐
- VR技术在数据中心3D机房中的应用 (下)
VR技术在数据中心3D机房中的应用 (下) 前面给大家简单科普了一下VR的硬件设备以及VR在各个领域的应用,是不是觉得非常高大上?千言万语概括成一句话,VR能给用户带来前所未有的沉浸感和交互方式,让人 ...
- image的resizeMode属性
Image组件必须在样式中声明图片的宽和高.如果没有声明,则图片将不会被呈现在界面上. 我们一般将Image定义的宽和高乘以当前运行环境的像素密度称为Image的实际宽高. 当Image的实际宽 ...
- 洛谷 P1085 不高兴的津津
这道题就是经典的条件分支的题https://www.luogu.org/problemnew/show/P1085 code: #include <stdio.h> int main() ...
- Openjudge-4132-四则运算表达式求值
这一题我们可以通过递归求解,首先我们可以把一个表达式分为三部分,分别是: (1)表达式 :项.加减 (2)项:因子.乘除 (3)因子:数.()表达式 这三项构成了递归的关系,我们可以看到,要求一个表达 ...
- 如何禁用python警告
有-W选项. python -W ignore foo.py 所属网站分类: python基础 > 综合&其它 作者:jiem 链接:http://www.pythonheidong.c ...
- 学习PyQuery库
学习PyQuery库 好了,又是学习的时光啦,今天学习pyquery 来进行网页解析 常规导入模块(PyQuery库中的pyquery类) from pyquery import PyQuery as ...
- php 链接 mongodb
1.下载phpmongodb 驱动:https://s3.amazonaws.com/drivers.mongodb.org/php/index.html 2.Precompiled binaries ...
- spring源码深度解析—Spring的整体架构和环境搭建
概述 Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用.Spring是于2003 年兴起的一个轻量级的Java 开发框 ...
- PS小demo
1.打开图像素材. 2.图层 >> 添加调整图层 >> 色相/饱和度. 得到如下效果: 3.创建新图层,将图层混合模式设为“柔光”,选择笔刷工具,硬度100%,按下图所示绘制该 ...
- 71.mybatis 如何获取插入的id【从零开始学Spring Boot】
[从零开始学习Spirng Boot-常见异常汇总] 在之前的文章已经讲过spring boot集成mybatis了,但是忘记说一个很重要的知识点了,那就是获取获取主键id,这篇文章补充下,sprin ...