简单工厂模式和策略模式的区别

直接上代码:

简单工厂模式:

------------------------------一个抽象类   --------------------------

abstract class AbsClass

{

//抽象方法:提供一些列的算法操作

public abstract void acceptCash(string org);

}

------------------------------2个实现类   --------------------------

//继承自抽象类

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(stringtype)

{

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");// 通过传入type 就可以得到具体的实现类,就好比:你去机场,你直接跟你秘书说,我们开车去机场,这个时候你秘书开车载我去,你负责坐车到机场就可以了。

AbsClass csuper= CashFactory.createCashAccept("B"); //或者 秘书去叫出租车 我们打车去

------------------------------策略模式:   --------------------------

前面的类没有任何变化,只是把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类,没有创建具体的对象,实现的代码的进一步封装,客户端代码并不需要知道具体的实现过程。

当然用的最多的还是两者的结合使用

------------------------------策略模式和简单工厂模式:  
--------------------------

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

//策略Context

class CashContext

{

//声明一个现金收费父类对象

private AbsClass cs;

public CashContext(String typr)

{

switch (type)     //跟秘书打个招呼 我要去机场

{

case "A":

cc = new CashContext(new A()); //同样是去机场,此时:自己开车去

break;

case "B":

cc = new CashContext(new B());//或者自己打车去

break;

case "...":

... ....

break;

}

}

//得到现金促销计算结果(利用了多态机制,不同的策略行为导致不同的结果)

public double GetResult(double money)

{

return cs.acceptCash(money);

}

}

客户端调用:

CashContext context=
CashContext("A");

double a=context.GetResult(double money);

总结:简单工厂模式:只需要发出命令,由他人去实现,策略模式:不仅仅要发出命令,还得由自己亲自去做。

简单工厂模式和策略模式的区别

时间: 2024-08-06 11:53:52

简单工厂模式和策略模式的区别的相关文章

二、使用简单工厂来改进策略模式

策略模式的使用,把一系列算法进行了封装,只需要通过配置不同的算法,即可以实现算法的自由切换.具体内容参考第一篇:http://www.cnblogs.com/lay2017/p/7570041.html 但是,由于有不同的策略,那么我们就需要在使用的时候进行策略的选择,例如: String strategyName = "strategy1"; Strategy strategy = null; switch(strategyName){ case "strategy1&qu

设计模式之_简单工厂模式、工厂方法模式、抽象工厂模式 、策略模式、策略与工厂的区别(转)

一.前言 话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰).Bmw(宝马).Audi(奥迪)),还雇了司机为他开车.不过,爆发户坐车时总是这样:上Benz车后跟司机说“开奔驰车!”,坐上Bmw后他说“开宝马车!”,坐上 Audi后他说“开奥迪车!”.你一定说:这人有病!直接说开车不就行了?!而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的 幸运的是这种有病的现象在OO语言中可以避免了.下面以Java语言为基础来引入我们本文的主题:工厂模式! 二.简介

简单工厂模式和策略模式的区别与结合

前言: 简单工厂模式和策略模式是大部分程序员,在学习设计模式时接触得最早,或在工作实践中也是用得相对比较多的两个设计模式. 一个是创建型,另一个是行为型,然而两种不同类型的模式,在某些地方也有一丝的相似之处,同时在某种场景下结合使用,能起到特别好的效果. 问题: 我觉得简单工厂模式和策略模式很相似.怎么相似?都是三个业务子类继承抽象父类,通过传入参数到容器类(工厂模式的factory类,策略模式的Content类),选择对应的类进行行为操作. 其实,UML图的确从外形上看没多大区别,但是,本质却

【设计模式】简单工厂模式与策略模式

[前言]今天再次把<大话设计模式>一书拿出来翻了一下,对于前面一节初探中讲诉的简单工厂模式和策略模式,有了更好的理解.按照习惯,还是继续梳理梳理. [简单工厂模式]:封装(数据+算法) 简单工厂模式的特点: 每一个子类最好能做到职责单一,将每一个需要涉及的数据和算法,封装成一个独立的类. 工厂模式中的工厂类其实起到了一个调度者的角色: 2.1 工厂类可以达到将实现具体逻辑的子类隐藏的效果,只需要将自己暴露调用实例化的接口,根据工厂类提供的对外方法,在内部实现逻辑判断,并最后实例化具体的子类对象

工厂模式与策略模式之区别

设计模式有很多种,其中功能相似的很多,但是为什么还要分这么多种名字,查阅资料,我觉得下面的解释最为合理:用途不一样,名字就有区别,一把斧头用来砍人就叫凶器,用来砍柴就叫伐木斧,用来劈门就叫消防斧,这些模式的名字都是根据具体使用时的场景,联系了现实里某样东西或某种习惯而取得,所以很相似的模式行为有不同叫法. 今天我们就来研究一些工厂模式与策略模式的一些区别: 工厂模式是创建型模式,适应对象的变化. 策略模式是行为性模式,适应行为的变化 工厂模式封装对象,实例化对象后调用的时候要知道具体的方法,策略

浅谈简单工厂模式和策略模式

1.简单工厂模式如图 代码: 缺点:简单工厂模式需要客户端认识两个类,Cash和CashFactory 优点:子类的实例化被工厂封装了起来,客户端看不到 2.策略模式如图 代码: public class Context{ Strategy strategy; public Context(Strategy strategy){ this.strategy = strategy; } public double getResult(double money){ return strategy.a

编程学习之简单工厂模式与策略模式

很久之前在学习c++的时候就听到老师说写代码要考虑重构,架构,在此期间学习到了一种简单工厂模式. 何为简单工厂模式呢?简单工厂模式又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 举个栗子,我们可能会遇到这类问题,假如需要一个软件,它可以计算各种图形的面积,使用简单工厂模式来构架的话就是通过创建一个工厂类,而程序运行过程中这些实例化这些具体的计算面积的算法类,然后主程序通过调用这些实例

设计模式之桥梁模式和策略模式的区别

桥接(Bridge)模式是结构型模式的一种,而策略(strategy)模式则属于行为模式.以下是它们的UML结构图. 桥梁模式: 策略模式: 在桥接模式中,Abstraction通过聚合的方式引用Implementor. 举一个例子: 策略模式:我要画圆,要实心圆,我可以用solidPen来配置,画虚线圆可以用dashedPen来配置.这是strategy模式. 桥接模式:同样是画圆,我是在windows下来画实心圆,就用windowPen+solidPen来配置,在unix下画实心圆就用uni

| 啥是工厂模式和策略模式?

简单工厂模式与策略模式 前言 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结. 使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性. 设计模式使代码编写真正工程化:设计模式是软件工程的基石脉络,如同大厦的结构一样. 在介绍设计模式之前需要先介绍一下面向对象的特性和UML类图. 面向对象的特点 封装.继承.多态. UML类图 在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Rea