大话设计模式--工厂方法模式 Factory Method -- C++实现
1. 工厂方法模式
定义一个用于创建对象的接口, 让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
和简单工厂模式相比:
A: 简单工厂模式最大的优点在于工厂类中包含有必要的逻辑判断, 根据客户端的选择条件动态实例化相关的类,对客户端来说去除了与具体产品的依赖。
但缺点是 添加新产品时 需要修改工厂类 case, 违背了 "开放-封闭" 原则。
B: 工厂方法模式实现时,需要由客户端来决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在,只是由工厂类内部转移到客户端。
实例:
operation.h -- operation.cpp
#ifndef OPERATION_H
#define OPERATION_H class Operation
{
public:
Operation();
double virtual getResult(); double strA;
double strB;
double result;
}; #endif // OPERATION_H
#include "operation.h" Operation::Operation()
{
strA = 0;
strB = 0;
result = 0;
} double Operation::getResult()
{
return result;
}
operationfunc.h operationfunc.cpp
#ifndef OPERATIONFUNC_H
#define OPERATIONFUNC_H #include "operation.h" class OperationAdd : public Operation
{
public:
double getResult();
}; class OperationSub : public Operation
{
public:
double getResult();
}; class OperationMul : public Operation
{
public:
double getResult();
}; class OperationDiv : public Operation
{
public:
double getResult();
};
#include "operationfunc.h" double OperationAdd::getResult()
{
result = strA + strB;
return result;
} double OperationSub::getResult()
{
result = strA - strB;
return result;
} double OperationMul::getResult()
{
result = strA * strB;
return result;
} double OperationDiv::getResult()
{
result = strA / strB;
return result;
}
factory.h factory.cpp 抽象工厂
#ifndef FACTORY_H
#define FACTORY_H #include "operation.h"
#include "operationfunc.h"
#include <string>
using namespace std; class Factory
{
public:
Factory();
virtual Operation* createOperation();
}; #endif // FACTORY_H
#include "factory.h" Factory::Factory()
{
} Operation* Factory::createOperation()
{}
addfactory.h addfactory.cpp
#ifndef ADDFACTORY_H
#define ADDFACTORY_H #include "factory.h" class AddFactory : public Factory
{
public:
AddFactory();
Operation* createOperation();
}; #endif // ADDFACTORY_H
#include "addfactory.h" AddFactory::AddFactory()
{
} Operation* AddFactory::createOperation()
{
return new OperationAdd();
}
subfactory.h subfactory.cpp
#ifndef SUBFACTORY_H
#define SUBFACTORY_H #include "factory.h" class SubFactory : public Factory
{
public:
SubFactory();
Operation* createOperation();
}; #endif // SUBFACTORY_H
#include "subfactory.h" SubFactory::SubFactory()
{
} Operation* SubFactory::createOperation()
{
return new OperationSub();
}
main.cpp
#include <iostream>
#include "operationfunc.h"
#include "addfactory.h"
#include "subfactory.h" using namespace std; int main()
{
cout << "Factory method " << endl; Factory *factory = new SubFactory();
Operation *oper = factory->createOperation();
oper->strA = 1.1;
oper->strB = 2.3; cout << "result: " << oper->getResult() << endl; return 0;
}
大话设计模式--工厂方法模式 Factory Method -- C++实现的更多相关文章
- C#设计模式——工厂方法模式(Factory Method Pattern)
一.概述在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口.如何应对这种变化?如何提供一种封装机制来隔离出“这个易变对象 ...
- [设计模式]工厂方法模式(Factory Method)
模式目的 定义一个用于创建对象的接口,让其子类来决定实例化哪个类. 工厂方法模式将类的实例化延迟到了子类中进行. 模式结构 组成部分 产品(Product) - 定义了产品功能的接口 具体产品(Con ...
- 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)
原文:乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pa ...
- 设计模式-03工厂方法模式(Factory Method Pattern)
插曲.简单工厂模式(Simple Factory Pattern) 介绍工厂方法模式之前,先来做一个铺垫,了解一下简单工厂模式,它不属于 GoF 的 23 种经典设计模式,它的缺点是增加新产品时会违背 ...
- 【设计模式】工厂方法模式 Factory Method Pattern
在简单工厂模式中产品的创建统一在工厂类的静态工厂方法中创建,体现了面形对象的封装性,客户程序不需要知道产品产生的细节,也体现了面向对象的单一职责原则(SRP),这样在产品很少的情况下使用起来还是很方便 ...
- 二十四种设计模式:工厂方法模式(Factory Method Pattern)
工厂方法模式(Factory Method Pattern) 介绍定义一个用于创建对象的接口,让子类决定将哪一个类实例化.Factory Method使一个类的实例化延迟到其子类. 示例有SqlMes ...
- 工厂方法模式-Factory Method(Java实现)
工厂方法模式-Factory Method 工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法让实例化的具体内容交给子类工厂来进行. 本文中的例子是这样的. 生产一个身份证, ...
- IOS设计模式浅析之工厂方法模式(Factory Method)
概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口. 如何隔离出这个易变对象的变化,使得系统中“其它依赖该对象的对 ...
- 设计模式之 - 工厂方法模式 (Factory Method design pattern)
1. 模式意图: 定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 2. 别名(Virtual Constructor) 3. 结构 4. 工厂方法模式C ...
随机推荐
- MySQL一:初识数据库
阅读目录 一 数据库是什么 二 数据库的概念 三 MySQL介绍 四 下载安装 五 MySQL软件基本管理 一 数据库是什么 之前所学,数据要永久保存,比如用户注册的用户信息,都是保存于文件中,而文件 ...
- zabbix api调用
zabbix api调用 api能干什么 Zabbix API allows you to programmatically retrieve and modify the configuration ...
- CAP原则 和BASE
CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性). Availability(可用性).Partition tolerance(分区容错性),三者不可得兼 [1] ...
- killall 命令
Linux系统中的killall命令用于杀死指定名字的进程(kill processes by name).我们可以使用kill命令杀死指定进程PID的进程,如果要找到我们需要杀死的进程,我们还需要在 ...
- secureCrt 开启Linux上的oracle服务
IP : 192.168.0.21 user: root pwd: 123456 --------------------------------------------------- ...
- 怎样取消不能改动(仅仅读打开)的word文件的password
作者:iamlaosong 朋友给我一个文档,是加了防改动password的,希望我能帮其取消.由于须要原文档的格式,取消方法例如以下(office2007环境): 1.打开文件.文件打开时,提演示样 ...
- ionic新手教程第七课-简要说明几种界面之间的參数传递及优缺点
截至2016年4月13日19点32分,我公布的ionic新手教程,已经公布6课了, 总訪问量将近6000,平均每节课能有1000的訪问量.当中訪客最多的是第三课有2700的訪客. watermark/ ...
- centos 7 安装 mail
yum install -y sendmail 将下面内容粘贴到/etc/mail.rc中 set ssl-verify=ignore set nss-config-dir=/root/.certs ...
- 【JMeter4.0学习(四)】之JMeter对JMS性能测试脚本开发
目录: 安装ActiveMQ并启动服务 JMeter对JMS点到点测试计划 JMeter JMS主题测试计划 附:相关学习地址 一.ActiveMQ官方下载地址:http://activemq.apa ...
- object.Equals与object.ReferenceEquals方法
object.Equals方法表达的是语义判等,不一定是引用判等. object.ReferenceEquals方法是肯定是引用判等. 怎么实现一个对象的值语义的 Equals方法?实验. MyCla ...