大话设计模式-策略模式与简单工厂模式

来源:http://blog.csdn.net/wulingmin21/article/details/6712684

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

例如:

CashNormal、CashRebate、CashReturn三种算法(正常收费、打折收费、返利收费),都继承CashSuper。如果还有别的收费方式,再写一个类,继承CashSuper。通过对CashContext的GetResult方法调用,可以得到收取费用的结果。通过构造方法传入具体的收费策略。

class CashContext
{
    private CashSuper cs;  

    public CashContext(CashSuper csuper)
    {
        this.cs = csuper;
    }  

    public double GetResult(double money)
    {
        return cs.acceptCash(money);
    }
 }  

简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。也就说实例化谁。

class CashFactory
{
    public static CashSuper createCashAccept(string type)
    {
        CashSuper cs = null;
        switch (type)
        {
            case "正常收费":
                cs = new CashNormal();
                break;
            case "满X返Y":
                CashReturn cr1 = new CashReturn("X", "Y");   //X、Y为具体的数值
                cs = cr1;
                break;
            case "打Z折":
                CashRebate cr2 = new CashRebate("0.Z");  //Z为具体的数值
                cs = cr2;
                break;
        }
        return cs;
    }
}  

很明显能看出策略模式和简单工厂模式不同点。

在简单工厂中,如果增加了新类,那么这个工厂也要随之更改。在策略模式中,虽然CashContext中不用更改,但它的客户端的代码就要更改了(客户端代码有条件判断语句,如果增加了其它的,就需要改动了)。最后,将策略与简单工厂结合:

class CashContext
{
    CashSuper cs = null;
    public CashContext(string type)
    {
        switch (type)
        {
            case "正常收费":
                CashNormal cs0 = new CashNormal();
                cs = cs0;
                break;
            case "满X返Y":
                CashReturn cr1 = new CashReturn("X", "Y");
                cs = cr1;
                break;
            case "打Z折":
                CashRebate cr2 = new CashRebate("0.Z");
                cs = cr2;
                break;
        }
    }
    public double GetResult(double money)
    {
        return cs.acceptCash(money);
    }
} 

客户端就不用去判断了。但是如果有别的需求,还是要改动Switch中的代码。

时间: 2025-01-30 15:00:29

大话设计模式-策略模式与简单工厂模式的相关文章

实例讲解PHP设计模式编程中的简单工厂模式_php实例

简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简单工厂模式是由一个工厂对象决定创建出那一种产品类的实例. 1.工厂模式的几种形态工厂模式专门负责将大量有共同接口的类实例化.工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类.工厂模式有以下几种形态: (1)简单工厂(Simple Factory)模式,又称静态工厂方法模式(Static Factory Method Pattern). (2)工厂方法(Factory Meth

工厂模式、简单工厂模式和抽象工厂模式有什么区别和联系?

问题描述 这三者主要区别和联系是什么?谁可以简单的说下? 解决方案 解决方案二: 解决方案三:有什么区别?解决方案四:简单工厂模式和工厂方法模式之对比1.简单工厂模式将选择权交给了工厂,根据客户端的选择条件动态实例化相关的类:工厂方法模式将选择权交给了客户端,客户端需要哪一个产品,只需要实例化其对应的具体工厂.2.工厂方法模式相对简单工厂模式复杂性增加,但灵活性更高了.3.工厂方法克服了简单工厂违背开放-封闭原则的缺点.4.两者都降低了客户端与具体类的耦合.5.工厂方法模式是简单工厂模式的进一步

设计模式C#描述之——简单工厂模式

设计 前言:设计模式是软件开发领域的精髓之一.学好设计模式是目前每一个开发人员的必修课.目前关于设计模式的书很多,其中比较好的有GOF那本的中译本,但并不很适合初学者.还有一本是<JAVA与模式>,比较适合初学者使用,在此强烈推荐.但这本书的不足之处是一些地方讲的过于繁琐,很多地方只须简单说明一下即可,却大费笔墨,使得书籍很厚,看起来费力.而且是用JAVA描述的,这使得一些只懂C#的人无从下手.我是一个.net的拥护者,为了看这本书我特意看了些JAVA的书,感觉JAVA在书籍的多样性方面比 .

设计模式系列之一:简单工厂模式

前言 设计模式能够帮助我们设计出健壮,低耦合性的代码,从此和高耦合的代码say goodbye!在所有的的设计模式中,简单工厂算是我们平时接触比较多的吧,多线程中的消费者工厂类与生产者工厂类应该算是接触最早的设计模式,简单工厂模式要解决的首要问题就是降低程序之间的耦合度,通过Java中的封装.继承与多态实现解耦.通过使用简单工厂模式,我们设计的代码更易于维护和复用 问题背景 在进入正题之前我们先看一下问题背景: 某公司开发了一个A软件,数据库使用的是SQLServer.后由于客户要求需要使用Or

PHP设计模式实例之(观察者模式、策略模式、简单工厂模式)

观察者模式 /** * 定义观察接口 */ interface Subject { public function Attach($Observer); //添加观察者 public function Detach ($Observer); //踢出观察者 public function Notify(); //满足条件时通知观察者 public function SubjectState($Subject); //观察条件 } /** * 观察类的具体实 现 */ class Boss Imp

Ruby中使用设计模式中的简单工厂模式和工厂方法模式_ruby专题

之前有看过<ruby设计模式>,不过渐渐的都忘记了.现在买了一个大话设计模式,看起来不是那么枯燥,顺便将代码用ruby实现了一下. 简单工厂模式: # -*- encoding: utf-8 -*- #运算类 class Operation attr_accessor :number_a,:number_b def initialize(number_a = nil, number_b = nil) @number_a = number_a @number_b = number_b end d

解读设计模式----简单工厂模式(SimpleFactory Pattern)

一.模式概述 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现,学习了此模式可以为后面的很多中模式打下基础.那好,我们就来了解下什么是简单工厂模式? 我们来分析一个现实生活中的案例,每天早晨起床洗唰后是干什么呢?吃早餐(这里只针对在外吃早餐的上班族

设计模式: 简单工厂模式

引入: 在我们的思维中,会有一种习惯,当遇到某种问题时,会直接考虑用最直接的语言去去实现它,而往往忽略了整个程序的可维护性.可扩展性. 比如,我们写一个基本的计算器功能,要求能计算四则运算,大家或许会直接写: public class ProgramDemo{ public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(

C#设计模式(2)——简单工厂模式

原文:C#设计模式(2)--简单工厂模式 一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式--简单工厂模式. 二.简单工厂模式的介绍 说到简单工厂,自然的第一个疑问当然就是什么是简单工厂模式了? 在现实生活中工厂是负责生产产品的,同样在设计模式中,简单工厂模式我们也可以理解为负责生产对象的一个类, 我们平常编程中,当使用"new"关键字创建一个对象时,此时该类就依赖与