设计模式 之美 -- 工厂方法模式
文章目录
- 1. 解决问题
- 2. 应用场景
- 3. 实现如下
- C++实现
- C语言实现
- 4. 缺点
1. 解决问题
在简单工厂模式中,我们使用卖衣服进行举例,同一种工厂可以卖很多不同种类的衣服,工厂只是将衣服的生产过程进行了封装。
当我们增加衣服种类的时候,在简单工厂模式中需要修改工厂的代码,破坏了类的开闭原则(对扩展开发, 对修改关闭),同时增加测试成本。
此时为了避免这种问题的出现,我们推出工厂方法模式,为每个商品封装指定的工厂方法,这样商品种类增加时对于工厂只需要增加指定的工厂就可以了。
2. 应用场景
- 逻辑中会经常使用到该类对象(需要经常进行new、malloc操作)
- 逻辑后续会有一定规模,最好这个时候就将对象的创建和使用分离
- 后续会小范围扩展产品类型
- 程序规模比较大,不希望每次增加产品后都对之前逻辑重新测试
3. 实现如下
C++实现
实现功能:还是卖衣服,针对每一种衣服创建指定的工厂,由工厂封装对象的创建过程。
#include <iostream>using namespace std;/*工厂的可以制造的衣服种类*/
enum ClothType{hat,paths};class Cloth{public:virtual void createCloth(void) = 0;virtual ~Cloth(){} //定义为虚函数,对象空间回收时则会调用子类的析构函数
};/*帽子类*/
class Hat: public Cloth{public:Hat(){cout << "Hat::hat()" << endl;}virtual void createCloth(void) {cout << "Hat::createHat()" << endl;}~Hat(){cout << "Hat::delete()" << endl;}
};/*裤子类*/
class Paths: public Cloth{public:Paths(){cout << "Paths::paths()" << endl;}virtual void createCloth(void) {cout << "Paths::createPaths()" << endl;}~Paths(){cout << "Paths::delete()" << endl;}
};/*工厂方法类,用来创建工厂*/
class Factory{
public:virtual Cloth *CreateProduct() = 0;
};/*帽子工厂,创建帽子*/
class FactoryHat : public Factory
{
public:Cloth *CreateProduct(){return new Hat ();}
};/*裤子工厂,创建裤子*/
class FactoryPaths : public Factory
{
public:Cloth *CreateProduct(){return new Paths ();}
};int main()
{Factory *factoryHat = new FactoryHat();Cloth *hat = factoryHat -> CreateProduct();hat -> createCloth();Factory *factoryPaths = new FactoryPaths();Cloth *paths = factoryPaths -> CreateProduct();paths -> createCloth();if(NULL != factoryHat) {delete factoryHat;factoryHat = NULL;}if(NULL != factoryPaths) {delete factoryPaths;factoryPaths = NULL;}if(NULL != hat) {delete hat;hat = NULL;}if(NULL != paths) {delete paths;paths = NULL;}return 0;
}
C语言实现
实现功能:生产橘子和苹果两种水果
/*用C语言实现工厂方法模式*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>enum {GRAPE,APPLE};typedef struct _Apple
{void (*print_apple)();
}Apple;typedef struct _Grape
{void (*print_grape)();
}Grape;void print_apple()
{printf("apple!\n");
}void print_grape()
{printf("grape!\n");
}Apple* sell_apple()
{Apple* pApple = (Apple*)malloc(sizeof(Apple));assert(NULL != pApple);pApple->print_apple = print_apple;return pApple;
}Grape* sell_grape()
{Grape* pGrape = (Grape*)malloc(sizeof(Grape));assert(NULL != pGrape);pGrape->print_grape = print_grape;return pGrape;
}typedef struct _FruitShop
{void* (*sell_fruit)();
}FruitShop;FruitShop* create_fruit_shop(int fruit)
{FruitShop* pFruitShop = (FruitShop*)malloc(sizeof(FruitShop));assert(NULL != pFruitShop);if (GRAPE == fruit){pFruitShop->sell_fruit = (void *(*)())sell_apple;}else if(APPLE == fruit){pFruitShop->sell_fruit = (void *(*)())sell_grape;}else{return NULL;}return pFruitShop;
}int main()
{FruitShop* apple = NULL;Apple* a = NULL;apple = create_fruit_shop(APPLE);a = (Apple *)apple->sell_fruit();a->print_apple();FruitShop* grape = NULL;Grape* g = NULL;grape = create_fruit_shop(GRAPE);g = (Grape*)grape->sell_fruit();g->print_grape();if(g != NULL){delete g;}if(grape != NULL){delete grape;}if(a != NULL){delete a;}if(apple != NULL){delete apple;}return 0;
}
4. 缺点
1、后续产品种类特别多的时候,需要建立很多工厂,导致程序熵值太大
2、对于有多个依赖关系的种类,如果仍然建立多个工厂,则会增加很多重复逻辑
相关文章:

java shiro实例_Apache Shiro入门实例
Shiro是一个强大灵活的开源安全框架,提供身份验证、授权、会话管理、密码体系。1.先创建一个Maven项目2.配置pomhttp://maven.apache.org/xsd/maven-4.0.0.xsd">4.0.0cn.edu.stushiro-test0.0.1-SNAPSHOTorg.apache.shiroshiro-core1.3.0org.slf4jslf4j-log…

采购申请-MRP
1、手工建立采购申请: ME51N 申请单建立的时候,在不知道给哪个部门使用的时候可以在科目指派中选择U 分配并处理采购申请:me57 A:首先分配供应商 B:在转换成PO 点自动分配-》点分配-》点处理分配完成PR转变成PO 2、MRP 首先要建立BOM,然后在建…

【C语言】07-预处理指令;-宏定义
预处理指令简介; 1,C在对源程序进行编译之前,会对一些特殊的预处理指令作解释,产生一个新的源程序,此过程叫做编译预处理.C在经过编译预处理之后才对新的源码进行通常的编译; 2,预处理以‘#’开头,且结尾不用分号,(用于和一般的C语句区分开来). 3,预处理指令可以出现在出现的任…

idea基于hibernate生成的Entitle对象,会忽略外键属性
需要自己手动添加 如 private String cgcode;BasicColumn(name "cgcode")public String getCgcode() {return cgcode;}public void setCgcode(String cgcode) {this.cgcode cgcode;} 转载于:https://www.cnblogs.com/asusdell/p/10482657.html

编程模式 之美 -- 抽象工厂模式
文章目录1. 解决问题2. 应用场景3. 实现如下:C实现C语言实现4. 缺点1. 解决问题 在工厂方法模式中,我们卖衣服。此时我们为每一种衣服创建不同的工厂,帽子有一个工厂专门创建,裤子有一个工厂专门创建,T恤有一个工厂专…

java map class_java – 将通用Class参数限制为实现Map的类
我正在尝试编写一个Map构建器.其中一个构造函数将允许客户端指定他们希望构建的Map类型public class MapBuilder {private Map map;/*** Create a Map builder* param mapType the type of Map to build. This type must support a default constructor* throws Exception*/pub…

双击进入物料数据的指定视图
SET PARAMETER ID MAT FIELD i_matnr-matnr.“物料号SET PARAMETER ID MXX FIELD K. 进入基本视图 "Table T132CALL TRANSACTION MM03 AND SKIP FIRST SCREEN. MXX 可以在后台查看: SPRO->后勤系统-一般->物料主档->设定物料主档->…

java中Integer装箱的注意
Integer inb 2;//自动装箱 Integer inc 2; System.out.println(inb inc );//输出true Integer biga 128; Integer bigb 128; System.out.println(biga bigb);//输出false上面的代码来自李刚老师的书,应该注意其中的细节.上面的输出与Integer的设计有关。1.系统…

rem自适应js
Rem自适应js---flexible.min.js 网上看到很多移动端适配的各种方法,由于原来工作中对rem的疏忽,所以决定重新学习rem~ 由于移动端特殊性,本文讲的是如何使用rem实现自适应,或叫rem响应式布局,通过使用一个脚本就可以re…

设计模式 之美 -- 建造者模式
文章目录1. 解决问题2. 应用场景3. 实现C语言实现C实现4. 缺点1. 解决问题 描述如下场景: 类的数据成员很多(8个以上),当我们进行初始化的时候放在初始化列表中,影响类的可读性,同时校验初始化参数列表是…

dateformat java 并发_java.text.DateFormat 多线程并发问题
在日常开发中,java.text.DateFormat 应该算是使用频率比较高的一个工具类,经常会使用它 将 Date 对象转换成字符串日期,或者将字符串日期转化成 Date 对象。先来看一段眼熟的代码:类 DateUtils 的方法 formatForDay() 在多线程的情…

每天一个摆脱if-else工程师的技巧——优雅的参数校验
在日常的开发工作中,为了程序的健壮性,大部分方法都需要进行入参数据校验。最直接的当然是在相应方法内对数据进行手动校验,但是这样代码里就会有很多冗余繁琐的if-else。throw new IllegalArgumentException("用户姓名不能为空");throw new IllegalArgumentException("性别不能为空");throw new IllegalArgumentException("性别错误");

我下载的最新的linux ADT+eclipse中没有NDK
问题描述我下载的是 adt-bundle-linux-x86_64-20140702.zip 这个版本。我已经安装了CDT了,但是还是没有NDK可以设置,而且在project右键android tools下 没有Add Native Support这个选项求指教,谢谢! 解决方案1你的Eclipse插件好…

Android中去掉标题的方法总结
方法一:也一般入门的时候经常使用的一种方法在setContentView()方法的前面插入代码: requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏 package com.example.helloword;import android.os.Bundle; import android.app.Activity; import and…

ImportError: No localization support for language ‘eng’ in python
ImportError: No localization support for language ‘eng’ in python 遇到這一個問題,是因為有缺少檔案,我是因為使用 pyinstaller 去包裝執行檔,所以需要手動加入這一個設定值進 .spec 檔案裡: hiddenimports[mysql,mysql.con…

C++ 智能指针(unique_ptr / shared_ptr)代码实现
文章目录unique_ptr 智能指针的实现shared_ptr 智能指针的实现指针类型转换unique_ptr 智能指针的实现 一个对象只能被单个unique_ptr 所拥有。 #include <iostream>using namespace std;/*增加模板类型,保证智能指针的类型是由传入的类型决定的*/ template…

winform实现截图
这个截图模仿QQ截图,左键单击开始截图,鼠标移动出现方框确定截图尺寸,放开时为最终尺寸,双击鼠标弹出保存对话框进行保存。 还有一点就是,如果截图尺寸方框已经确定,移动鼠标到所选区域内时,鼠标…

java interface list_你了解注解内的@interface List么
Annotation, Multi-valued annotation, nested annotation, 多值注解, 嵌套注解今天在研究Spring MVC的Validation机制时(这里 | 还有这里),简单看了下一些注解的源码,比如Min,发现以前从来没注意到的注解写法。看来基础知识有疏漏啊.../*** …

Struts 2的输入校验(一)
9 Struts 2的输入校验输入校验有两种:客户端和服务器端校验。客户端校验一般是通过JavaScript来完成,这种校验可减轻服务器压力。服务器校验主要通过服务器端编程的方式来完成。(1) 客户端校验客户端校验一般是通过JavaScript来完成,这种校验…

通过document.domain实现跨域访问
通过document.domain实现跨域访问:https://blog.csdn.net/nlznlz/article/details/79506655 前端跨域方法之document.domain和location.hash:https://blog.csdn.net/WEB_YH/article/details/79364565 转载于:https://www.cnblogs.com/bydzhangxiaowei/p/…

设计模式 之美 -- 原型模式
文章目录1. 解决问题2. 应用场景3. 实现方式C实现C语言实现4. 缺点5. 和其他三种创建模式的对比(单例,工厂,建造者)1. 解决问题 如果对象的创建成本较大,而同一个类的不同对象之间的差别不大(大部分字段相…

Objective-C语法简记
开始学习iPhone开发了,虽然现在已经有了Swift,但我还是老老实实地学习Objective-C,鄙人入门的程序语言是C,后来学习了C#和Java,现在来学Objective-C,这篇只是一些很简略的笔记,不算是语法书。 代…

java编写最大公约数_Java编写最大公约数和最小公倍数
package javaapplication24;class NegativeIntegerException extends Exception{String message;public NegativeIntegerException(){message"方法的参数值不是正整数";}public String toString(){return message;}}class MaxCommonDivisor{public int getMaxCommonD…
肤色检测算法 - 基于不同颜色空间简单区域划分的皮肤检测算法
由于能力有限,算法层面的东西自己去创新的很少,很多都是从现有的论文中学习,然后实践的。 本文涉及的很多算法,在网络上也有不少同类型的文章,但是肯定的一点就是,很多都是不配代码的,或者所附带…

【算法学习】堆排序建立最大堆
本文代码均转自: 作者:早就戒了 来源:CSDN 原文:https://blog.csdn.net/qq_37169817/article/details/79777264 版权声明:本文为博主原创文章,转载请附上博文链接! 1 public class HeapSort { 2…

设计模式 之美 -- 代理模式
文章目录1. 解决问题2. 应用场景1. 业务系统的非功能性开发2. 代理模式在RPC、缓存中的应用3. 实现C实现C语言实现1. 解决问题 客户端和目标对象之间需要进行交互,此时客户端类和目标对象类相关操作之间的逻辑如果交合在一起,会导致客户端和目标对象模块…

java中注解的使用_java中注解的使用
使用过ssh框架的人一定也使用过注解,尤其是在spring框架中,注解可谓是spring容器和AOP编程的重要环节。注解就是用于修饰类、全局变量、方法、参数或局部变量的接口,java中规定,注解的使用不允许影响其修饰类的存在,也…

水题/poj 1852 Ants
1 /*2 PROBLEM:poj18523 AUTHER:Nicole4 MEMO:水题5 */6 #include<cstdio>7 using namespace std;8 int cmax(int a,int b){return a>b?a:b;}9 int cmin(int a,int b){return a<b?a:b;} 10 int main() 11 { 12 int cases; 13 scanf("%d…

素数、最大公约数、最下公倍数、质因数分解
2013-08-18 11:20:43 素数、最大公约数、最下公倍数、质因数分解都是与素数相关的,解决了素数的问题,其他的都可以此为基础求解。 小结: 求1到n之间的素数的基本方法是通过遍历2到sqrt(n),判断每个数是否是素数来得到,…

Spring注解 开发
转载于:https://www.cnblogs.com/JBLi/p/10489541.html