设计模式学习-工厂方法模式

  在上文(设计模式学习-简单工厂模式)的模拟场景中,我们用简单工厂模式实现了VISA和MASTERARD卡的刷卡处理,系统成功上线并运行良好,突然有一天老大跑来说,我们的系统需要升级,提供对一般银联卡的支持。怎么办?有需求总是要改的,苦B的程序员伤不起啊....

  怎么改?增加一个银联卡处理类?然后在工厂类的静态方法里增加Case处理?前几天刚读了面向对象的核心设计原则-“开放封闭原则”,这样改下去不是完全违背了这个设计原则?
 

  开放封闭原则(OCP,Open Closed Principle)是所有面向对象原则的核心。软件设计本身所追求的目标就是封装变化、降低耦合,而开放封闭原则正是对这一目标的最直接体现。其他的设计原则,很多时候是为实现这一目标服务的,例如以Liskov替换原则实现最佳的、正确的继承层次,就能保证不会违反开放封闭原则。开放封闭原则,其核心的思想是:软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的


于是,我决定重构之前的简单工厂模式实现的方法,首先我们找出变化点,增加银联卡处理类是不可避免,这属于扩展,对工厂类增加CASE条件的处理,这里属于修改原业务,属于修改,OCP告诉我们,对修改应该是关闭的。

  OK,顺利找到变化点,由于我们不知道将来需要实例化出什么对象,所以将产品工厂抽象出来,让对象的实例化在子类实现:

ExpandedBlockStart.gifView Code 
abstract class HandleFactory
    {
        public abstract BankCardHandle CreateBankCardHandle();

  接着,我们实现生成VISA及MASTERARD刷卡对象的实际工厂:

ExpandedBlockStart.gifView Code 
class VisaHandleFactory : HandleFactory 
    {
        public override BankCardHandle CreateBankCardHandle()
        {
            return new VisaHandle();
        }
    }

    class MasterCardHandleFactory : HandleFactory
    {
        public override BankCardHandle CreateBankCardHandle()
        {
            return new MasterCardHandle();
        }
BankCardHandle、VisaHandle、MasterCardHandle类见上一篇(设计模式学习-简单工厂模式)。

  不知不觉,我们用工厂方法模式重构了我们的系统,下面我们看看工厂方法模式的介绍。

模式概述:

工厂方法模式又称工厂模式,属于类的创建型模式。在工厂方法模式中,父类负责定义创建对象的公共接口,而子类则负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成,即由子类决定究竟应该实例化哪一个类。
UML类图:


其中的类或对象之间的关系为:

  • 产品角色(Product)
    定义产品的相关接口。

  • 真实的的产品角色(ConcreteProduct)
    实现接口Product。

  • 工厂角色(Factory)
    声明工厂方法(FactoryMethod),返回一个产品(Product)。

  • 真实的工厂(ConcreteFactory)
    实现FactoryMethod工厂方法,由客户调用,返回一个Product实例。

  经过上面我们用工厂方法模式重构刷卡系统后,老大提出的增加一个银联卡的处理就比较好办了,先增加一个银联卡处理类,同时增加一个生产银联卡处理类的工厂类:

ExpandedBlockStart.gifView Code 
class UnionPayCardHandle : BankCardHandle
    {
        public override void HandleProcess()
        {
            Console.WriteLine("银联卡处理中");
        }
    }

    class UnionPayCardHandleFactory : HandleFactory
    {
        public override BankCardHandle CreateBankCardHandle()
        {
            return new UnionPayCardHandle();
        }

客户端调用代码如下:
ExpandedBlockStart.gifView Code 
HandleFactory hd = new UnionPayCardHandleFactory();
            BankCardHandle bk = hd.CreateBankCardHandle();

我们以后增加卡处理方式,只需要增加相应的卡处理类和生成卡处理类的工厂,然后修改一下客户端代码就好了,如果连客户端代码都不想修改,在客户端获取配置文件,用反射处理就OK了。

转载于:https://www.cnblogs.com/kdalan/archive/2012/06/01/2531395.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/260761.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

word2010激活工具使用方法

1、关闭杀毒,关闭正打开着的word文档 2、执行Activator_v1.2.exe-->Activation Office 2010VL --》按1 --》完毕。 3、打开word--》文件--》帮助--》看右上角。 2、【补充】使用 Office 2010 Toolkit 下载地址: http://vdisk.weibo.com/s/yoz9R 或…

第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波17 - 锐化高通滤波器 - 梯度图像(罗伯特,Sobel算子)

目录锐化(高通)空间滤波器使用一阶导数锐化图像-梯度锐化(高通)空间滤波器 平滑通过称为低通滤波类似于积分运算锐化通常称为高通滤波微分运算高过(负责细节的)高频,衰减或抑制低频…

网络传输层之TCP、UDP详解

1、传输层存在的必要性 由于网络层的分组传输是不可靠的,无法了解数据到达终点的时间,无法了解数据未达终点的状态。因此有必要增强网络层提供服务的服务质量。 2、引入传输层的原因 面向连接的传输服务与面向连接的网络服务类似,都分为建立连…

第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波18 - 低通、高通、带阻和带通滤波器、组合使用空间增强方法

低通、高通、带阻和带通滤波器 得到空间滤波器的第三种方法,生成一维滤波器函数,然后要么使用式(3.42)wvvTw vv^TwvvT生成二维可分离的滤波器函数,要么旋转这些一维函数来生成二维核。旋转后的一维函数是圆对称(各向同性&#x…

Linux Tomcat 6.0安装配置实践总结

系统环境: Red Hat Enterprise Linux Server release 5.7 (Tikanga) 64位 Tomcat下载 从官方网站 http://tomcat.apache.org/下载你需要的Tomcat版本,目前Tomcat主要版本有Tomcat 6.0、Tomcat 7.0、Tomcat 8.0三个版本,下面我们以6.0(6.0.39…

第4章 Python 数字图像处理(DIP) - 频率域滤波1 - 傅里叶级数和变换简史

本章主要讲解频域域滤波的技术,主要技术用到是大家熟悉的傅里叶变换与傅里叶反变换。这里有比较多的篇幅讲解的傅里叶的推导进程,用到Numpy傅里叶变换。本章理论基础比较多,需要更多的耐心来阅读,有发现有错误,可以与我…

分页探究--Filter+JSTL

最近卡了一个功能就是分页,查了很多资料,分页大概是两种类型:一种是把数据库的东西全部查出来然后放在session里,用list一页一页传到页面,这样的消耗比较大;另一种就是使用sql语句的limit来进行数据库分页查询。我使用…

python能做大型游戏吗_python有做大型游戏的潜力吗?

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 岂止是有潜力,简直是很合适! 猪厂两大游戏客户端引擎,NeoX 和 Messiah,都使用 Python 作为脚本语言。 你最近所了解的比较火的挂着猪厂旗号的&a…

第4章 Python 数字图像处理(DIP) - 频率域滤波2 - 复数、傅里叶级数、连续单变量函数的傅里叶变换、卷积

目录基本概念复数傅里叶级数冲激函数及其取样(筛选)性质连续单变量函数的傅里叶变换卷积基本概念 复数 复数CCC的定义为 CRjI(4.3)C R jI \tag{4.3}CRjI(4.3) R,IR,IR,I为实数,RRR是实部,III是虚部,j−1j \sqrt{-…

不要迷失在技术的海洋中【转】

转自http://www.cnblogs.com/lovecherry/archive/2007/10/28/940555.html 不要迷失在技术的海洋中 技术就好像一片汪洋大海,越深入越望不到边际。就拿自己的体验来说吧,2000年的时候在学校搞ASP,觉得网页开发就是这么简单,把数据库…

使用代码设置Item级的权限(权限总结1)

itle in english:set Item Level Permission for SharePoint (MOSS/WSS) List/Document Library Programmatically 有些时候,我们需要为文档库里面某个文件设置特殊的权限,这个权限不继承自列表权限,当然最简单的最好是再创建一个列表&#…

echarts 4.0.4怎么下载_怎么让ECharts的提示框tooltip自动轮播?

1. 怎么让ECharts的提示框tooltip自动轮播?在用ECharts做大屏或者可视化展示项目的时候,让提示框tooltip自动轮播是比较常见的需求,给大家推荐一个插件叫echarts-tooltip-auto-show,名字是有点长,但是挺好用的。在hover显示tooltip之后&…

[React Native]高度自增长的TextInput组件

之前我们学习了从零学React Native之11 TextInput了解了TextInput相关的属性。 在开发中,我们有时候有这样的需求, 希望输入区域的高度随着输入内容的长度而增长, 如下: 这时候我们需要自定义一个组件: 在项目中创建AutoExpandingTextInput.js import …

第4章 Python 数字图像处理(DIP) - 频率域滤波3 - 取样和取样函数的傅里叶变换、混叠

目录取样和取样函数的傅里叶变换取样取样后的函数的傅里叶变换取样定理混叠由取样后的数据重建(复原)函数取样和取样函数的傅里叶变换 取样 fˉ(t)f(t)sΔT(t)∑n−∞∞f(t)δ(t−nΔT)(4.27)\bar f(t) f(t)s_{\Delta T}(t) \sum_{n-\infty}^{\infty}…

[转]Android开发,实现可多选的图片ListView,便于批量操作

本文转自:http://www.cnblogs.com/gergulo/archive/2011/06/14/2080629.html 之前项目需要实现一个可多选的图片列表,用户选中一到多张图片后,批量上传。但是网上有可多选普通列表的代码、也有单纯图片列表的代码,却没有两者合并的…

个人信息安全影响评估指南_发布 | 网络安全标准实践指南—移动互联网应用程序(App)收集使用个人信息自评估指南...

关于发布《网络安全标准实践指南—移动互联网应用程序(App)收集使用个人信息自评估指南》的通知信安秘字[2020] 40号各有关单位:为落实《网络安全法》相关要求,围绕中央网信办、工信部、公安部、市场监管总局联合制定的《App违法违规收集使用个人信息行为…

在线生成 CSS3 的工具

1) CSS Creator – Layout Design 2) CSS Menu Maker 3) CSS3 Please 4) CSS3 Generator 5) CSS Border Radius 6) CSS3 Gradient Generator 7) CSS3 Button Generator 8 ) Mike Plate’s CSS3 Playground 9) Border Image Generator 10) CSS3 WRAP 11) Button Maker 12) Font…

python image 转成字节_就是这么牛!三行Python代码,让数据处理速度提高2到6倍

本文可以教你仅使用 3 行代码,大大加快数据预处理的速度。Python 是机器学习领域内的首选编程语言,它易于使用,也有很多出色的库来帮助你更快处理数据。但当我们面临大量数据时,一些问题就会显现……在默认情况下,Pyth…

第4章 Python 数字图像处理(DIP) - 频率域滤波5 - 二变量函数的傅里叶变换、图像中的混叠、二维离散傅里叶变换及其反变换

目录二变量函数的傅里叶变换二维冲激及其取样性质二维连续傅里叶变换对二维取样和二维取样定理图像中的混叠二维离散傅里叶变换及其反变换二变量函数的傅里叶变换 二维冲激及其取样性质 两个连续变量的冲激函数定义为: δ(t,z){1,tz00,others(4.52)\delta(t, z) …

QC4+充电协议_一文看懂各家充电协议!总算彻底理清了

五一小长假马上就要到了,虽说今年的五一小长假是一个长达5天的“Plus”版小长假,但是受到疫情的影响,大多数人还是选择了在家中度过这个假期。既然说到了宅在家里度过这个假期,那么很多人都会选择让手机来陪伴自己度过。虽然最近几…