策略模式与简单工厂模式区别(转)

 

最近一直在抽时间研究设计模式,之前对设计模式也有一定的了解,但是都没有平心静气的去研究过,只是了解了一些皮毛,最近打算再深入研究一下,重新打开了设计模式的数据,对之前的疑问一个个的刨根问底,今天看了简单工厂模式和策略模式看的人有点小晕,两个的大概思路没有怎么变,都是通过多态去减少代码的耦合度,怎么看两个都是如出一辙,最后终于找到了两个的本质区别,在此和大家分享下:

先上代码:

简单工厂模式:

//抽象类
abstract class AbsClass
{
    //抽象方法:提供一些列的算法操作
    public abstract void acceptCash(string org);
}

//继承自抽象类
class A:AbsClass
{
    //具体方法:提供一些列的算法操作
    public override double acceptCash(string org)

         Console.WriterLine("A类方法");

  }
}

 

//继承自抽象类
class B:AbsClass
{
    //具体方法:提供一些列的算法操作
    public override double acceptCash(string org)

         Console.WriterLine("B类方法");

  }
}

... .... ....

简单工厂类

//现金收取工厂
class CashFactory
{
    //根据条件返回相应的对象
    public static AbsClass createCashAccept(string type)
    {
        AbsClass cs = null;
        switch (type)
        {
            case "A":
                cs = new Al();
                break;
            case "B":
                cs = new B();
                break;
            case "...":
                ........ ....
                break;
        }
        return cs;
    }
}

 

客户端调用:

/利用简单工厂模式根据下拉选择框,生成相应的对象
AbsClass csuper = CashFactory.createCashAccept("A");

 

策略模式:

 前面的类没有任何变化,只是把Factory变成了CaseContext策略类

//策略Context
class CashContext
{
    //声明一个现金收费父类对象
    private AbsClass cs;

    //设置策略行为,参数为具体的现金收费子类(正常,打折或返利)
    public CashContext(AbsClass csuper)
    {
        this.cs = csuper;
    }

    //得到现金促销计算结果(利用了多态机制,不同的策略行为导致不同的结果)
    public double GetResult(double money)
    {
        return cs.acceptCash(money);
    }
}

 

客户端调用:

AbsClass cc = null;
   switch (cbxType.SelectedItem.ToString())
            {
                case "A":
                    cc = new CashContext(new A());
                    break;
                case "B":
                    cc = new CashContext(new B());
                    break;
                case "...":
                    ... ....
                    break;
            }

最后概括总结一下:

策略模式和简单工厂模式看起来非常相似,都是通过多态来实现不同子类的选取,这种思想应该是从程序的整体来看得出的。如果从使用这两种模式的角度来看的话,我们会发现在简单工厂模式中我们只需要传递相应的条件就能得到想要的一个对象,然后通过这个对象实现算法的操作。而策略模式,使用时必须首先创建一个想使用的类对象,然后将该对象最为参数传递进去,通过该对象调用不同的算法。在简单工厂模式中实现了通过条件选取一个类去实例化对象,策略模式则将选取相应对象的工作交给模式的使用者,它本身不去做选取工作。

结合上面的代码和下面的释义不难看出,其实两个的差别很微妙,Factory是直接创建具体的对象并用该对象去执行相应的动作,而Context将这个操作给了Context类,没有创建具体的对象,实现的代码的进一步封装,客户端代码并不需要知道具体的实现过程。

上面是在网络看到的一篇文章

下面加上我的理解:

1、按一般教程中出现的例子理解:

简单工厂模式:传条件进工厂类,工厂类就会返回一个对象给调用者,供调用者使用---最终给用户使用的是工厂类返回的类

策略模式:创建一个Context类(可以看作是工厂模式中工厂类的代替品)的对象A,传一个要使用的策略实例对象给A,然后使用A调用A中的某些方法---最终给用户用的是Context类

简单的说,工厂有进货也有出货,然后使用出货。策略有进货没出货,然后使用得货者。

2、更准确理解:用户是使用工厂类生产的对象(要求工厂类生产对象的类的对象)进行操作,而用户是使用用户自己传给策略的对象进行操作。

简单的说,工厂类的使用者需要不是自己创建的对象,策略模式中Context类的使用者需要的是自己创建的对象。

更简单的说,工厂模式:我没有,我需要你的。策略模式:我自己有,我用我自己的。


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

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

相关文章

c语言中枚举类型的长度,C中的枚举类型数据的大小是多少?

这是一个C面试测试问题不是家庭作业。#include using namespace std;enum months_t { january, february, march, april, may, june, july, august, september,october, november, december} y2k;int main (){cout << "sizeof months_t is " << sizeof(m…

求平方根sqrt()函数的底层算法效率问题

我们平时经常会有一些数据运算的操作&#xff0c;需要调用sqrt&#xff0c;exp&#xff0c;abs等函数&#xff0c;那么时候你有没有想过&#xff1a;这个些函数系统是如何实现的&#xff1f;就拿最常用的sqrt函数来说吧&#xff0c;系统怎么来实现这个经常调用的函数呢&#xf…

android espresso跨程序,Android Espresso:依次运行多个测试

我正在尝试使用Espresso forAndroid进行一系列测试.运行之间似乎没有关闭活动.一次测试后,无论应用程序状态如何,左侧为下一次测试.如何用Espresso来实现&#xff1f;错误报告中提供的修复程序的问题是,这将仅在整个套件的完成时执行.如果你想在每次测试后都有一个干净的活动堆…

C#中字符串的内存分配与驻留池

刚开始学习C#的时候&#xff0c;就听说CLR对于String类有一种特别的内存管理机制&#xff1a;有时候&#xff0c;明明声明了两个String类的对象&#xff0c;但是他们偏偏却指向同一个实例。如下&#xff1a; String s1 “Hello”; String s2 “Hello”; //s2和s1的实际值都…

signature=f2388c4f1bce538cc797410d9560f03b,KSHV strategies for host dsDNA sensing machinery

摘要&#xff1a;The innate immune system utilizes pattern recognition receptors cyclic GMP-AMP synthase(cGAS)to sense cytosolic double-stranded(ds) DNA and initiate type 1 interferon signaling and autophagy pathway, which collaborate to limit pathogen infe…

Unity 内存管理

一&#xff1a;资源类型 GameObject, Transform, Mesh, Texture, Material, Shader, noxss和各种其他Assets。 二&#xff1a;AssetBundle文件内存镜像 来自文件就用CreateFromFile(注意这种方法只能用于standalone程序&#xff09;这是最快的加载方法。也可以来自Memory,用…

1.逐帧动画shader

最近项目压力不大&#xff0c;抽时间看了些关于shader和游戏引擎的书籍&#xff0c;准备开始shader的学习。 在网上看到这位前辈&#xff08;http://blog.sina.com.cn/s/articlelist_2312702844_6_1.html&#xff09;写的博客&#xff0c;觉得很不错&#xff0c;学习曲线应该很…

panel中html怎么写,panel控件有什么用 请写出Panel控件的用途

当多个panel控件重叠时,把一个panel的visible/设置为true,其它的设置为f例如有3个panel&#xff0c;分别为panel1,panel2,panel3 如果重叠的话&#xff0c;把他们的大小设置为相同大小&#xff0c;直接通过上下层来控制即可&#xff0c;例如想要panel2显示出来&#xff0c;就用…

html页面如何实现搜索功能,使用jQuery怎么实现一个页面关键字搜索功能

使用jQuery怎么实现一个页面关键字搜索功能发布时间&#xff1a;2021-01-04 16:46:38来源&#xff1a;亿速云阅读&#xff1a;136作者&#xff1a;Leah这篇文章给大家介绍使用jQuery怎么实现一个页面关键字搜索功能&#xff0c;内容非常详细&#xff0c;感兴趣的小伙伴们可以参…

html相对定位向上偏移,使用CSS的相对定位和偏移量

这是利用CSS相对定位和偏移写成的表单输入框效果&#xff0c;不是以前用的表格那种&#xff0c;也没有用UL li&#xff0c;觉得借此示例可练习一下CSS,特别是CSS的定位和布局方面的知识&#xff0c;了解top,bottom,left,right这些偏移量属性的用法。CSS相对定位和偏移写成的表单…

2.转动的地球shader

原理很简单&#xff0c;根据时间对uv中的x轴进行位移&#xff0c;对于地面和云层&#xff0c;取不同的移动速度&#xff0c;分别计算对应的uv坐标&#xff0c;再根据uv坐标从地面和云层的纹理中分别取出对应的值&#xff0c;最后把两者用lerp函数进行混合作为最终结果。 下边的…

3.顶点外扩方法实现的描边shader

描边shader的实现有很多种&#xff0c;顶点外扩是其中之一。顶点外扩的原理是用2个Pass 渲染物体2次第一遍:描边&#xff0c;顶点沿法线方向外拓后用黑色渲染。外扩这一步的实现是在投影空间&#xff0c;也就是2D的&#xff0c;根绝法线的x和y值进行外扩&#xff0c;因为是沿着…

为此计算机所有用户安装加载项,安装Office 2013后,无法在计算机上安装Outlook加载项...

我使用Outlook Add in模板和VSTO在visual studio 2010中实现了Outlook添加&#xff0c;我使用MSI安装程序(在visual studio 2010中创建)为它创建了一个安装..我能够在所有机器上安装它(x86和x64) ) .最近我尝试在安装了Office 2013的计算机上安装相同的安装程序并收到以下错误&…

4.边缘光照的描边shader

【思路】&#xff1a;面向摄像机的物体&#xff0c;它的表面法线【normal】和视角向量【viewDir】的【夹角】越靠近边缘就越大。那么就可以根据这个夹角进行处理&#xff0c;夹角越大&#xff0c;那么发射光越强&#xff0c;就可以实现我们想要的效果。 Shader "Study/4_O…

html 怎么设置cooki,怎么设置浏览器接受cookie

怎么设置浏览器接受cookie把浏览器设置成接受cookie方法&#xff0c;以IE11为例&#xff1a; 1&#xff0c;打开IE浏览器&#xff0c;在菜单栏上点击“工具”&#xff0c;弹出下拉菜单点击“Internet选项”。 2&#xff0c;点击“隐私”选项&#xff0c;在页面中点击“高级”。…

5.Lambert光照Diffuse Shader

http://blog.csdn.net/candycat1992/article/details/17355629 这篇文章写的很好&#xff0c;这里就直接上代码了 Shader "Study/5_LambertDiffuse" {Properties{_Color("Main Color", Color) (1,1,1,1)_MainTex("Base (RGB)", 2D) "whit…

计算机用户的注册表,计算机上的注册表在哪里

注册表在哪里: 计算机中的注册表在哪里&#xff1f;疯狂代码&#xff1f;: http://CrazyCoder.cn/DeveloperUtil/Article31113.html“开始”→“运行”菜单项&#xff0c;在运行中输入regedit&#xff0c;然后按Enter打开注册表编辑器&#xff0c;逐一展开上述各项以获取注册表…

2017计算机应用技术考研,2017年中国科学技术大学081203计算机应用技术考研专业目录与考试科目.docx...

2017 年中国科学技术大学081203 计算机应用技术考研专业目录及考试科目081203 计算机应用技术1401、计算机网络应用技术李晓风① 101 思想政治理论&#xff1b;② 201谭海波英语一&#xff1b; ③ 301 数学一&#xff1b;④ 40802、计算机视觉张 龙计算机学科专业基础综合03、遥…

6.Half Lambert光照Diffuse Shader

简单来说&#xff0c;Lambert定律认为&#xff0c;在平面某点漫反射光的光强与该反射点的法向量和入射光角度的余弦值成正比&#xff08;即我们之前使用dot函数得到的结果&#xff09;。Half Lambert最初是由Valve&#xff08;游戏半条命2使用的引擎即是其开发的&#xff09;提…

伯克利计算机科学录取率,Berkeley的CS「加州大学伯克利分校计算机科学系」

加州大学伯克利分校电气工程与计算机科学系开设有以下学位项目&#xff0c;分别是&#xff1a;电气工程与计算机科学理学硕士(MS in Electrical Engineering and Computer Sciences)&#xff1a;为期1-2年&#xff0c;共计24个学分&#xff0c;要求申请者本科毕业&#xff0c;不…