设计模式笔记——策略模式VS简单工厂模式

策略模式VS简单工厂模式

  策略模式(Strategy)它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。

1.组成

—抽象策略角色: 策略类,通常由一个接口或者抽象类实现。

—具体策略角色:包装了相关的算法和行为。

—环境角色:持有一个策略类的引用,最终给客户端调用。

2.应用场景

— 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。

—需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。

—对客户隐藏具体策略(算法)的实现细节,彼此完全独立。

所有设计模式总结请参考:http://blog.csdn.net/chr23899/article/details/46999267

所有设计原则总结请参考:http://blog.csdn.net/chr23899/article/details/46999401

首先来看下具体的效果图

简单工厂模式的实现过程请参考:http://blog.csdn.net/chr23899/article/details/47000609

主要包括两个数 Number_X 和Number_Y 下面是四个操作
Add(+)、 Sub(-) 、 Mul(*)、 Div(/); 当用户选择一种模式后 点击其中一个操作时会安装具体的设计模式进行实例化具体的操作类型。

策略模式的类图如下:

具体实现代码如下:

//策略基类
    public abstract class Strategy
    {
        //定义虚函数
        public abstract double Result(double Number_x, double Number_y);
    }

    //加法运算
    public class Strategy_Add : Strategy
    {
        public override double Result(double Number_x, double Number_y)
        {
            double number = 0;
            number = Number_x + Number_y;
            return number;
        }
    }

    //减法运算
    public class Strategy_Sub : Strategy
    {
        public override double Result(double Number_x, double Number_y)
        {
            double number = 0;
            number = Number_x - Number_y;
            return number;
        }
    }

    //乘法运算
    public class Strategy_Mul : Strategy
    {
        public override double Result(double Number_x, double Number_y)
        {
            double number = 0;
            number = Number_x * Number_y;
            return number;
        }
    }

    //除法运算
    public class Strategy_Div : Strategy
    {
        public override double Result(double Number_x, double Number_y)
        {
            double number = 0;
            if (Number_y == 0)
                return 0;
            number = Number_x / Number_y;
            return number;
        }
    }

    //具体执行的对象
    public class Context
    {
        private Strategy strate;
        public Context(Strategy str)
        {
            this.strate = str;
        }
        public double GetResult(double Number_x, double Number_y)
        {
            return strate.Result(Number_x, Number_y);
        }
    }</span>

首先提一下: 在简单工厂模式中使用了Virtual(虚函数) , 在策略模式中使用Abstract(抽象函数),让我们先来认识下他们之间的区别:

virtual和abstract都是用来修饰父类的,通过覆盖父类的定义,让子类重新定义。

它们有一个共同点:如果用来修饰方法,前面必须添加public,要不然就会出现编译错误:虚拟方法或抽象方法是不能私有的。毕竟加上virtual或   abstract就是让子类重新定义的,而private成员是不能被子类访问的。但是它们的区别很大。

(1)virtual修饰的方法必须有实现(哪怕是仅仅添加一对大括号),而abstract修饰的方法一定不能实现。

(2)virtual可以被子类重写,而abstract必须被子类重写

(3)如果类成员被abstract修饰,则该类前必须添加abstract,因为只有抽象类才可以有抽象方法。

(4)无法创建abstract类的实例,只能被继承无法实例化,比如:     BaseTest2 base2 = new BaseTest2();将出现编译错误:抽象类或接口不能创建实例。

(5)C#中如果要在子类中重写方法,必须在父类方法前加virtual,在子类方法前添加override,这样就避免了程序员在子类中不小心重写了父类方法。

(6)abstract方法必须重写,virtual方法必须有实现(即便它是在abstract类中定义的方法).

在认识策略模式和简单工厂模式两者的区别时我们先来看下两者在客户端的调用方式

        Operation oper;

        //简单工厂获取计算结果
        private void GetResult_factory(string str)
        {
            oper = null;
            oper = FactoryOfOperation.GetTheOperation(str);
            oper.Number_x = Convert.ToDouble(txt_x.Text.Trim());
            oper.Number_y = Convert.ToDouble(txt_y.Text.Trim());
            txt_result.Text = oper.Result().ToString();
        }

        Context cont;
        Strategy strate;
        //策略模式获取计算结果
        private void GetResult_strategy(string str)
        {
            strate = null;
            switch (str)
            {
                case "add":
                    strate = new Strategy_Add();
                    break;
                case "sub":
                    strate = new Strategy_Sub();
                    break;
                case "mul":
                    strate = new Strategy_Mul();
                    break;
                case "div":
                    strate = new Strategy_Div();
                    break;
                default:
                    break;
            }
            cont = new Context(strate);
            txt_result.Text = cont.GetResult(Convert.ToDouble(txt_x.Text.Trim()), Convert.ToDouble(txt_y.Text.Trim())).ToString();
        }

从客户端来看,简单工厂需要至少需要两个类,一个是工厂类Factory,用来产生具体的功能类Operation,一个是这个Operation类,在这个Operation类中定义可以被要被重写的方法。客户端使用的时候首先要使用Factory类根据客户端条件,产生具体的Operation类,然后再使用Operation类中的方法实现具体的功能;策略类,在客户端也要接触两个类,一个是想要的具体算法类Category,一个是上下文类Context,Context类的构造方法接受一个Category类型对象,然后调用这个对象的具体算法实现具体的功能,Context类和Factory有点类似,和简单工厂模式不同的是Context接受一个对象,用这个对象来实例化自己,然后来调用自己的方法,当然这个方法是用这个对象中的方法。而Factory类接受条件产生一个对象,具体使用这个对象的方法还是要调用这个对象中的方法,而不是Factory中的方法。就是说Factory只负责获得对象,Context要依靠一个具体的对象来实例化自己,并调用具体的功能方法。

个人总结并整理 有不妥之处请大家指出并纠正。

原文出处: http://blog.csdn.net/chr23899  转发请说明

源程序下载地址:http://download.csdn.net/detail/chr23899/8924105

版权声明:本文为博主原创文章,未经博主允许不得转载。 博客列表: http://blog.csdn.net/chr23899

时间: 2024-10-27 05:14:01

设计模式笔记——策略模式VS简单工厂模式的相关文章

设计模式之策略模式&amp;amp;简单工厂模式

学习设计模式已经有非常长一段时间了,事实上先前已经敲过一遍了.可是老认为没有学到什么,认识也不够深刻.如今趁着重构机房,再又一次来过,也不晚. 事实上在敲了机房之后,看看模式,事实上,曾经非常难理解.非常难看懂的代码一眼就能够看懂了,趁着有点感觉了.早点收获吧. 简单工厂模式: 简单地说简单工厂模式:非常easy变化的地方,就能够用到简单工厂模式. 实例: 举个样例:我们在逛商场时.正好商场促销,各种优惠活动:有满300返100 ,有打8折的.抽奖等等吧. 促销来讲,各种优惠活动事实上就是变化.

java笔记--策略模式和简单工厂模式

策略模式: --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3884781.html "谢谢-- 为什么使用:策略模式主要用于有很多不同的方式来解决同一个问题的情景.如:文件的保存:可保存成txt,也可保存成xml.另外压缩文件.商场的促销策略等是类似的 如何使用:需要定义一个接口或者抽象类来表示各种策略的抽象,由于在选择适当的策略上有些不方便,需要不断地判断需要的类型,因此需要用简单工厂方法来实现判断过程 例子: 用策略模式实现图

设计模式学习笔记(二)--简单工厂模式和工厂模式

老生长谈的两个设计模式了,这里把这两个设计模式对比着来总结一下. 什么是简单工厂模式? 简单工厂模式:根据传入工厂类的参数动态决定要创建哪一个产品类的实例. UML图如下(以实现一个计算器为例): 简单工厂模式的Java代码实现如下: 1 package designPattern; 2 /** 3 * 简单工厂模式 4 * @author yiRain 5 * 6 */ 7 public class SimpleFactory { 8 9 public static void main(Str

深入理解设计模式(二):简单工厂模式

本文首先概述了简单工厂模式本质及结构,揭示了简单工厂模式的应用场景和优缺点,紧接着列举出了和工厂方法模式.策略模式的异同及应用场景,最后我们给出了简单工厂模式的实现方式及注意事项. 一.什么是简单工厂模式 简单工厂模式又称为静态工厂模式,实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例.简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例. 其实就是将一个具体类的实例化交给一个静态工厂方法来执行,它不属于GOF的23种设计

java设计模式 -------- 创建模式 之 简单工厂模式

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 工厂模式是最常用的模式,因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a = new A(),工厂模式也是用来创建用来创建实例对象的,所以以后new时要多个心眼,是否可以考虑使用工厂模式. 简单工厂模式又可以分成三种模式: 1) 普通简单工厂模式 2) 多方法简单工厂模式 3) 多静态方法简单工厂模式 普通简单工厂模式: 举例:(简单的

策略模式与简单工厂模式

1,简单工厂模式 a) 有一个抽象的接口用来表示工厂需要生产的产品共性:然后各个具体的产品类实现该抽象接口. b) 工厂只需要持有产品的抽象接口,工厂接收一个 TYPE 参数来决定生产何种产品. c) 对于客户而言,当他需要某种类型的产品时,只需要获得工厂对象,然后将产品的 TYPE参数传递给工厂,由工厂创建他所需要的产品. 2,策略模式 策略,本质上是一种算法.当客户需要处理某件事情时,由于所处的环境不同,他可以采取不同的方式(策略)去处理.因此,客户关注的是如何方便得获取所需的策略. a)

设计模式_创建型模式_简单工厂模式

转载自:http://blog.csdn.net/lovelion  作者:刘伟 简单工厂模式并不属于GoF 23个经典设计模式,但通常将它作为学习其他工厂模式的基础,它的设计思想很简单,其基本流程如下:        首先将需要创建的各种不同对象(例如各种不同的Chart对象)的相关代码封装到不同的类中,这些类称为具体产品类, 而将它们公共的代码进行抽象和提取后封装在一个抽象产品类中,每一个具体产品类都是抽象产品类的子类: 然后提供一个工厂类用于创建各种产品,在工厂类中提供一个创建产品的工厂方

设计模式(一): 简单工厂模式

一.模式定义 简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式.在简单工厂模式中,可以根据参数的不同返回不同类的实例.简单来说,也就是由一个工厂类根据传入的参数决定创建出哪一种产品类的实例. 二.模式结构 (图片来自博客:https://blog.csdn.net/xingjiarong/article/details/49999121) 简单工厂模式主要有三个部分组成: 工厂类(Creator

&quot;围观&quot;设计模式(8)--创建型之简单工厂模式、工厂方法模式、抽象工厂模式

工厂模式的核心思想在我认为是将类创建的权利授予给工厂类,其他的类不允许创建,授予了权限的类创建好之后,需要某些的对象的时候,可以去工厂当中去取.也就是像一个工厂一样,用的人不需要关心对象怎么来的,你只需要关心怎么用就好了.工厂模式细分为三种,简单工厂.工厂方法.抽象工厂三种模式.这三种模式比较相似,往往会引发混淆,本文主要结合实际的例子去进行区分.理清三者之间的关系与适用范围. 概述 简单工厂 对于简单工厂,我个人的理解是,直接实现一个方法,要生产什么由这个方法以及传入的参数来决定. 工厂方法