设计模式(1)--简单工厂模式、策略模式

设计模式(1)--简单工厂模式、策略模式

1. 简单工厂模式

在阎宏博士的《JAVA与模式》一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。


先放图再解释。下图一是从《大话设计模式》中摘出来的。问题是:用任意一种面向对象语言实现一个计算器控制台程序,要求输入两个数和运算符号,得到结果。

简单工厂模式实现的关键点有两个:

1. 继承:定义一个抽象父类“抽象产品”(Operation类),和一堆具体的子类“实际产品”(OperationAdd等子类)。抽象父类的设计是非常重要的(属性、方法)

2. 关联关系:定义一个“工厂类”,他提供生产产品的方法(图中createOperate()),然后返回一个产品(Operation类)。关联关系使一个类知道另一个类的属性和方法。

解决问题:如何实例化一个合适的对象

扩展方法:新增“产品”子类,并修改“工厂类”的创建逻辑。

使用方法:使用工厂类创建产品类,然后调用产品方法或属性。(客户端了解两个类:工厂类和产品抽象类)

优点:简单。但应用很广哦

缺点:每次还需要修改创建逻辑,如果创建逻辑挂掉,整个就挂了。 而且每次扩展都要修改“工厂类”代码,这就需要重新编译部署代码。

使用场景:负责创建的对象比较少;客户只知道传入工厂的参数,不关心对象创建逻辑。 容易违反高内聚低耦合,一般只在很简单的情况下使用。

 

图一. 简单工程模式类图示例

 

 

 1 class Test{
 2     public static void main( String[] args ){
 3         Operation oper;
 4         OperationFactory operFac = new OperationFactory();
 5         oper = operFac.createOperation("+");
 6         oper.setOpA(1);
 7         oper.setOpB(2);
 8         oper.getResult();
 9     }
10 }
11 
12 class OperationFactory{
13     public Operation createOperation( String op ){
14         if( op == "+" )    return new OperationAdd();
15         if( op == "-" )    return new OperationMinus();
16         if( op == "*" )    return new OperationMultiply();
17         return new OperationDivide();
18     }
19 }
20 
21 abstract class Operation{
22     private double opA;
23     private double opB;
24     
25     public double getOpA() {
26         return opA;
27     }
28 
29     public void setOpA(double opA) {
30         this.opA = opA;
31     }
32 
33     public double getOpB() {
34         return opB;
35     }
36 
37     public void setOpB(double opB) {
38         this.opB = opB;
39     }
40 
41     public abstract double getResult();
42 }
43 
44 class OperationAdd extends Operation{
45     public double getResult(){
46         return getOpA() + getOpB();
47     }
48 }
49 
50 class OperationMinus extends Operation{
51     public double getResult(){
52         return getOpA() - getOpB();
53     }
54 }
55 
56 class OperationMultiply extends Operation{
57     public double getResult(){
58         return getOpA() * getOpB();
59     }
60 }
61 
62 class OperationDivide extends Operation{
63     public double getResult(){
64         if( getOpB() == 0 )
65             try {
66                 throw new Exception("除数不能为0");
67             } catch (Exception e) {
68             }
69         return getOpA() / getOpB();
70     }
71 }
View Code

 

2. 策略模式

在阎宏博士的《JAVA与模式》一书中开头是这样描述策略(Strategy)模式的:

  策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。


先放图再解释。下图二是从《大话设计模式》中摘出来的。问题实例是:做一个商场收银软件,根据客户购买商品的单价和数量,向客户收费。而商场可能做活动:打折、满减、满返之类的 

策略模式实现的关键点有两个 

1. 继承:实现某个功能需要一个“抽象算法类”(Strategy),算法可以有不同的实现,这些”具体算法类“(ConcreteStrategy)继承”抽象算法类“的通用接口。(Strategy类的接口设计是很重要的) 

2. 聚合关系:对算法的使用进行封装,即提供一个算法的对外接口(Context类),Context类持有一个Strategy,把算法的使用和算法本身分开。     Context里有算法,但这个算法具体是啥,根据上下文不同,可能会是不同的算法。在什么样的情况下,配置采用哪个算法来实现,这就是Context的工作。用户只需要提供上下文给Context,然后Context就提供调用算法的接口。这个时候,Context和Strategy的关系更密切,它充当了算法与客户之间的接口,客户完全接触不到Strategy类了,但是Context完全了解Strategy。 (聚合关系中,整体和个体是“has-a”的关系,整体部分可分离。)

扩展方法:新定义一个符合Strategy接口定义的算法,在Context里重新添加这一配置(如果采用反射,则可以避免这部分代码的修改,只需新定义ConcreteStrategy就好了,这个以后会讲)

使用方法:用户向Context传递上下文,然后调用Context的算法接口方法就好了。(客户端了解一个类:Context类)----这个可能是要和简单工厂模式联合使用

优点

(1)提供管理相关算法的协议。同类算法实现不同,但有相同的行为特征,还可以把公共代码放到父类,避免冗余。  

(2)封装算法变化。

 

 1 class Context{
 2     Strategy str;
 3     public Context( Strategy str ){
 4         this.str = str;
 5     }
 6     
 7     public void contextInterface(){
 8         str.algorithmInterface();
 9     }
10 }
11 
12 public abstract class Strategy {
13     public abstract void algorithmInterface();
14 }
15 
16 class ConcreteStrategyA extends Strategy{
17     public void algorithmInterface(){}
18 }
19 
20 class ConcreteStrategyB extends Strategy{
21     public void algorithmInterface(){}
22 }
23 
24 class ConcreteStrategyC extends Strategy{
25     public void algorithmInterface(){}
26 }
View Code

 

 

 

 

 图二.策略模式类图

 

 3. 总结

策略模式和简单工厂模式的几点不同:

  • 策略模式有两层封装。第一,把具体算法封装到Strategy:所有实现相同功能的算法继承这个类;第二, 把算法封装起来,只提供用户需要的功能:用Context把算法封装起来,Context定义用户可以使用的接口,Context确定使用哪个算法实现用户要求的具体功能。
  • 简单工厂模式有一层封装。把产品封装到Product类,并提供生产产品的方法。即没有策略模式中的第二层封装,这里用户需要完成配置产品的动作,虽然使用工厂方法,这个配置动作简单了一些,但是用户还是要执行。但是策略模式中,用户根本就不需要去了解任何配置的事情,也不需要了解算法的存在。
  • 策略模式的应用强调:相同行为不同实现的算法封装。算法和产品的不同在于,算法原本只是为了实现对象的某个行为,由于实现经常变动,因此把这种经常改变的部分提取出来,作为一个抽象类封装起来。 所以说策略模式属于对象行为模式
  • 简单工厂模式的应用强调:相同类别产品的封装。产品关注的是一个个的对象。所以简单工厂模式属于类的创建型模式
  • 这两种模式都不注重实现,都是在于如何组织、调用产品或算法,所以抽象出一些新的类实现这些管理功能。----设计模式有点参考管理学的东西吧。

 

 

posted on 2015-08-31 16:42 HF_Cherish 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/hf-cherish/p/4759881.html

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

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

相关文章

kmp算法讲解

转自——http://blog.csdn.net/v_july_v/article/details/7041827 看到kmp是不是立即想到(*ο*) 哇~,那个东西啊,就是拿来放电影的那个啊! 哦,但是这里我们说的并不是那个东西,身为一名C选手,我…

TLS/SSL协议工作原理

1、TLS/SSL的功能实现原理简单介绍 HTTPS协议的主要功能基本都依赖于TLS/SSL协议,TLS/SSL的功能实现主要依赖于三类基本算法:散列函数 Hash、对称加密和非对称加密,其利用非对称加密实现身份认证和密钥协商,对称加密算法采用协商的密钥对数据加密,基于散列函数验证信息的…

实现DDD领域驱动设计: Part 4

原文链接: https://dev.to/salah856/implementing-domain-driven-design-part-iv-29m2对象到对象映射当两个对象具有相同或相似的属性时,自动对象到对象映射是一种将值从一个对象复制到另一个对象的有用方法。DTO和实体类通常具有相同/相似的属性,你通常…

软件项目组织管理(六)项目时间管理

文章目录项目计划和进度计划什么是活动活动清单活动属性里程碑时间管理的过程1. 活动定义2. 活动排序三种依赖关系箭线图法(ADM)/双代号网络(AOA)前导图法(PDM)/单代号网络(AON)3. 活…

win7开机按F8后,为什么没有修复计算机的选项

有时win7开机按F8后,没有修复计算机的选项本文将向大家介绍如何通过 Windows 7自带的“配置 Windows 恢复环境(RE)”命令 – ReagentC.exe,启用“高级启动选项”下的“修复计算机”选项。单击 Windows 开始图标,在“搜索程序和文件”输入框中…

TLS/SSL握手过程

参考了:https://www.wosign.com/faq/faq2016-0309-04.htm 1、握手与密钥协商过程 基于RSA握手和密钥交换的客户端验证服务器为示例详解TLS/SSL握手过程。 (1).client_hello 客户端发起请求,以明文传输请求信息,包含版本信息,加密套件候选列表,压缩算法候选列表,随机数,扩…

FluentValidation在C#中是怎么进行数据验证的

介绍FluentValidation 是一个基于 .NET 开发的验证框架,用于构建强类型验证规则的 .NET 库。开源免费支持 .Net所有平台 包括.NetFramework和.NetCore.FluentValidation 组件内提供十几种常用验证器,可扩展性好,支持自定义验证器,…

基于Metronic的Bootstrap开发框架经验总结(5)--Bootstrap文件上传插件File Input的使用...

Bootstrap文件上传插件File Input是一个不错的文件上传控件,但是搜索使用到的案例不多,使用的时候,也是一步一个脚印一样摸着石头过河,这个控件在界面呈现上,叫我之前使用过的Uploadify 好看一些,功能也强大…

软件项目组织管理(七)项目成本管理

文章目录什么是成本什么是项目成本学习曲线理论储备金什么是项目成本管理目的过程成本估算成本估算的工具和技术成本预算主要工作成本估算和成本预算的关系和区别成本管理的工具方法净现值投资回报率挣值分析法什么是成本 为达到一个特定目标而花费的资源。 什么是项目成本 …

大话领域驱动设计——简介

如果说当下最热门的技术概念或架构思想,那么领域驱动设计(DDD)一定占有一席之地。上个系列,我讲了ABP vNext框架在微服务架构下的落地思路,而ABP vNext是基于DDD思想的完整框架之一,同时DDD也是微服务架构服…

软件项目组织管理(八)项目质量管理

文章目录软件质量的重要性对质量的认识传统的认识新的认识质量与等级什么是质量什么是质量管理什么是软件质量软件项目管理的目标质量管理的过程质量管理发展的四个阶段戴明改进循环(PDCA循环)项目质量计划编制方法——质量标杆法影响项目质量的因素(5M1…

Avalonia跨平台入门第十九篇之语音播放

在前面分享的几篇中咱已经玩耍了Popup、ListBox多选、Grid动态分、RadioButton模板、控件的拖放效果、控件的置顶和置底、控件的锁定、自定义Window样式、动画效果、Expander控件、ListBox折叠列表、聊天窗口、ListBox图片消息、窗口抖动、语音发送;今天趁着大周末的时间接着去…

软件项目组织管理(九)项目人力资源管理

文章目录什么是人力资源人力资源的特征什么是项目人力资源管理管理员工的关键所在马斯洛的需求层次理论赫兹伯格的双因素理论权力理论提高项目工作有效性的7种习惯人力资源管理过程人力资源管理的工具方法责任分配矩阵资源负荷资源平衡团队发展的5个阶段(塔克曼模型…

javax.jdo.option.ConnectionURL配置的问题

2019独角兽企业重金招聘Python工程师标准>>> Hive安装过程中出现 The reference to entity "createDatabaseIfNotExist" must end with the ; delimiter.问题,具体如下所示: [Fatal Error] hive-site.xml:132:95: The reference to…

设计模式21:State 状态模式(行为型模式)

State 状态模式(行为型模式) 动机(Motivation) 在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态的行为就可能完全…

在 k8s 以外的分布式环境中使用 Dapr

在Dapr 文档和实践案例中多是推荐采用k8s, 其实我目前也是在k8s 上操作的,有公有云TKE,AKS,还有私有云的Rancher ,它并没有传闻中的那么难,而且我认为它非常容易上手。不过,我还是有很多人不愿意使用k8s 。…

javascript原型链中 this 的指向

为了弄清楚Javascript原型链中的this指向问题,我写了个代码来测试: var d {d: 40};var a {x: 10,calculate: function (z) {return this.x this.y z this.d},__proto__:d};var b {y: 20,__proto__: a};var c {y: 30,__proto__: a};运行如下的代码…

Lucene5.5.4入门以及基于Lucene实现博客搜索功能

前言 一直以来个人博客的搜索功能很蹩脚,只是自己简单用数据库的like %keyword%来实现的,所以导致经常搜不到想要找的内容,而且高亮显示、摘要截取等也不好实现,所以决定采用Lucene改写博客的搜索功能。先来看一下最终效果&#x…

都是基于.NET平台,WPF能取代Winform吗?

学Winform还是WPF?很多winform的学者时常在我的技术群咨询要不要学习WPF?我一贯的观点是必须学啊!如果是搞工控做cs软件开发,WPF自然是首选。WPF优势在哪里?①前后端分离:WPF是数据驱动的而非Winform的事件…

正确对待生活

三文鱼,国人称为马哈鱼。是一类洄游性鱼类,为常被食用的鱼类之一。主要生活在大西洋及太平洋,在美洲大湖及其他湖可以找到。三文鱼在淡水环境下出生,之后移到海水生长,又会洄游到淡水繁殖。三文鱼会利用太阳和地球磁场…