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++实现的更多相关文章

  1. C#设计模式——工厂方法模式(Factory Method Pattern)

    一.概述在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口.如何应对这种变化?如何提供一种封装机制来隔离出“这个易变对象 ...

  2. [设计模式]工厂方法模式(Factory Method)

    模式目的 定义一个用于创建对象的接口,让其子类来决定实例化哪个类. 工厂方法模式将类的实例化延迟到了子类中进行. 模式结构 组成部分 产品(Product) - 定义了产品功能的接口 具体产品(Con ...

  3. 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)

    原文:乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pa ...

  4. 设计模式-03工厂方法模式(Factory Method Pattern)

    插曲.简单工厂模式(Simple Factory Pattern) 介绍工厂方法模式之前,先来做一个铺垫,了解一下简单工厂模式,它不属于 GoF 的 23 种经典设计模式,它的缺点是增加新产品时会违背 ...

  5. 【设计模式】工厂方法模式 Factory Method Pattern

    在简单工厂模式中产品的创建统一在工厂类的静态工厂方法中创建,体现了面形对象的封装性,客户程序不需要知道产品产生的细节,也体现了面向对象的单一职责原则(SRP),这样在产品很少的情况下使用起来还是很方便 ...

  6. 二十四种设计模式:工厂方法模式(Factory Method Pattern)

    工厂方法模式(Factory Method Pattern) 介绍定义一个用于创建对象的接口,让子类决定将哪一个类实例化.Factory Method使一个类的实例化延迟到其子类. 示例有SqlMes ...

  7. 工厂方法模式-Factory Method(Java实现)

    工厂方法模式-Factory Method 工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法让实例化的具体内容交给子类工厂来进行. 本文中的例子是这样的. 生产一个身份证, ...

  8. IOS设计模式浅析之工厂方法模式(Factory Method)

    概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口. 如何隔离出这个易变对象的变化,使得系统中“其它依赖该对象的对 ...

  9. 设计模式之 - 工厂方法模式 (Factory Method design pattern)

    1. 模式意图:  定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 2. 别名(Virtual Constructor) 3. 结构 4. 工厂方法模式C ...

随机推荐

  1. YUV格式学习汇总

    本文为个人学习使用,部分内容摘自他人. 参考: https://www.cnblogs.com/ALittleDust/p/5935983.html http://www.cnblogs.com/az ...

  2. 基于java spring框架开发部标1078视频监控平台精华文章索引

    部标1078视频监控平台,是一个庞杂的工程,涵盖了多层协议,部标jt808,jt809,jt1078,苏标Adas协议等,多个平台功能标准,部标796标准,部标1077标准和苏标主动安全标准,视频方面 ...

  3. Rocchio算法

    一.引子 查询扩展(Query Expansion)是信息检索领域的一个重要话题. 一方面.用户本身可能会出错,他会输入一些错别字,比方把"冯小刚",错写成"冯晓刚&qu ...

  4. Spring在注入bean异常时的替换

    情形:需要把数据库1的连接池A注入到DAO中,但是如果数据库A的连接池实例化失败了整个项目也启动不了,这个时候希望用数据库2的连接池来替换. 这里没有想到什么好的解决方法,只是想到了工厂方法提供Bea ...

  5. torrent&BT百科

    转自:百度百科 名词指代 Tracker:收集下载者信息的服务器,并将此信息提供给其他下载者,使下载者们相互连接起来,传输数据. 种子:指一个下载任务中所有文件都被某下载者完整的下载,此时下载者成为一 ...

  6. printf()与 scanf()

    一直以来就没有认真看过控制台输入输出的格式,现今找了一些材料,分享如下: 1. 格式化规定符     Turbo C2.0提供的格式化规定符如下: ━━━━━━━━━━━━━━━━━━━━━━━━━━ ...

  7. bootstrap input 加了 disabled 后台竟然接受不到值

    下午做了一个input  值需要不可改变.在input属性中加入了  disabled .在后台接受  var_dump($_POST); 竟然看不到值. <input type="t ...

  8. git 常用使用命令

    http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html http://www.open-open.com/lib/view/open14 ...

  9. 【v2.x OGE教程 11】 动画编辑器帮助文档

    ] 动画编辑器帮助文档 版本号 日期 作者 说明 1.0 2014-9-3 橙子游戏 文档创建       一.简单介绍 动画编辑器用于游戏动画的可视化编辑,支持序列帧动画和关键帧动画.通过解析生成的 ...

  10. 反素数ant(数学题)

    1053: [HAOI2007]反素数ant Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2872  Solved: 1639[Submit][St ...