设计模式(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 }

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 }

图二.策略模式类图

3. 总结

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

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

设计模式(1)--简单工厂模式、策略模式的相关文章

对设计模式的总结之简单工厂与策略模式

前言 面向对象编程追求的本质-提高扩展性.可维护性.灵活性和复用性.合理利用面向对象6个原则,能够很好的达到要求.如何利用好就是至关重要的了,前人总结了23+个设计模式能够让初学者更容易学到其中的精髓,本文就说说我对本人对简单工厂模式.策略模式的见解. 简单工厂模式与策略模式 简单工厂模式 工作中,常常遇到需要做一个功能(鸭子),这个功能中含有可控个数的子操作功能(鸭子叫,鸭子跑,鸭子飞),而且子功能在不同的情况下处理方式又不相同(成年鸭子/小鸭子叫,成年鸭子/小鸭子跑,成年鸭子/小鸭子飞).我

简单工厂与策略模式

简单工厂模式 专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类.它又称为静态工厂方法模式,属于类的创建型模式.简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例. 该模式中包含的角色及其职责: 1.工厂(Creator)角色 简单工厂模式的核心,它负责实现创建所有实例的内部逻辑.工厂类可以被外界直接调用,创建所需的产品对象. 2.抽象(Product)角色 简单工厂模式所创建的所有对象的父类,它负责描述所有实

设计模式(二):策略模式

简单工厂模式是客户告诉工厂所需要的对象,然后由工厂生产对象交给客户,客户去具体考虑的使用对象中的方法.而策略模式则有所不同,客户自己创建对象,但是当客户需要调用对象的方法时,则交由另一个环境角色类(Context)来实现,客户本身不关心方法的具体实现过程.策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.在这种模式中,主要有三种角色: 抽象策略角色: 策略类,通常由一个接口或者抽象类实现. 具体策略角色:包装了相关的算法和行

【设计模式】简单工厂模式(改进后的)

在前一篇[简单工厂模式]中,使用计算器为例做了记录,在前文中提到了我写的简单工厂模式和书上讲得有点不同: 简单工厂模式只是用来创建对象,而关于此对象的操作是另外一回事,程序员需要手动根据工厂类创建的类对象(一般是父类对象指针,静态类型为父类,动态类型为子类,多态的基础). 而我在工厂内部加了一个GetResult函数,这个函数用来计算结果,计算结果的依据是根据工厂类的构造函数中的输入为工厂类的[计算器]抽象基类指针用new 子类()去赋值,然后调用计算结果虚函数. 刚才看了[大话设计模式]中讲得

【设计模式】简单工厂模式

以面向对象的思想和简单工厂模式,写一个C++计算器程序,代码如下: #include <iostream> using namespace std; class Operation { public: Operation(double left, double right) { lhs = left; rhs = right; } const double GetLeft() const { return lhs; } const double GetRight() const { retur

设计模式之简单工厂模式

设计模式之简单工厂模式 动机:         不暴露实例化逻辑来创建对象.通过公共的接口创建新的对象.         这是一个简单的实现,客户端需要一个product,但是client不直接使用new对象,而是通过提供需要的对象信息来找factory得到新的product.         这个factory实例化一个具体的product并返回(转化成抽象的类),client段使用这个抽象的类而不用考虑它具体的实现. 应用举例:        也许工厂模式是使用最多的模式之一.举个例子,一个

设计模式初探—简单工厂模式

为什么要学习设计模式? 可重用.可维护.可扩展.灵活性好 什么是简单工厂模式? 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现. 简单工厂模式的好处? (1)将具体业务和实现进行分离 (2)将多个具体业务之间进行解耦 解决的问题? 单独的类来创造

【幻化万千戏红尘】qianfengDay10-java基础学习:成员内部类、静态内部类、局部和匿名内部类,设计模式之简单工厂模式

课程回顾: 接口:1.属性:public\static\final2.方法:public\abstract 多态:1.静态化(编译时)多态重载2.动态化(运行时)多态重写对象转型 1.向上转型 2.向下转型 今日内容:内部类:定义在类的内部的类1.成员内部类格式:[修饰符] class 类名 { }内部不能有静态的属性和方法,可以访问外部类的属性,也可以调用外部类的方法 在静态方法中的使用格式:外部类 外对象=new 外部类();成员内部类 对象名=外对象.new 成员内部类(); 2.静态内部

iOS设计模式 - (3)简单工厂模式

iOS设计模式 - (3)简单工厂模式           by Colin丶 转载请注明出处:              http://blog.csdn.net/hitwhylz/article/details/40381721 一.简述 简单工厂模式(FACTORY),通过面向对象的封装,继承和多态来降低程序的耦合度.将一个具体类的实例化交给一个静态工厂方法来执行. 该模式中的角色包括: 工厂类(Simple Factory): 只包含了创建具体类的静态方法. 抽象产品(Product):

大话设计模式_简单工厂模式(Java代码)

简单的描述:一个父类.多个子类,实例化那个子类由一个单独的工厂类来进行 图片摘自大话设计模式: 运算类: 1 package com.longsheng.simpleFactory; 2 3 public class Calculate { 4 5 private double firstNum; 6 private double secondNum; 7 8 public double getFirstNum() { 9 return firstNum; 10 } 11 12 public v