简单工厂模式和策略模式的区别
看书上的介绍《大话设计模式》,这两很像,都是用一个专门的类来根据客户端的条件产生不同的类,实现不同的功能。两个有什么区别呢,怎么取舍呢,没有自己写过实际的运用,有点晕啊,只能侃侃,耍耍嘴皮子。
从客户端来看,简单工厂需要至少需要两个类,一个是工厂类Factory,用来产生具体的功能类Function,一个是这个Function类,在这个Function类中定义可以被要被重写的方法。客户端使用的时候首先要使用Factory类根据客户端条件,产生具体的Function类,然后再使用Function类中的方法实现具体的功能;策略类,在客户端也要接触两个类,一个是想要的具体算法类Category,一个是上下文类Context,Context类的构造方法接受一个Category类型对象,然后调用这个对象的具体算法实现具体的功能,Context类和Factory有点类似,和简单工厂模式不同的是Context接受一个对象,用这个对象来实例化自己,然后来调用自己的方法,当然这个方法是用这个对象中的方法。而Factory类接受条件产生一个对象,具体使用这个对象的方法还是要调用这个对象中的方法,而不是Factory中的方法。就是说Factory只负责获得对象,Context要依靠一个具体的对象来实例化自己,并调用具体的功能方法。
从类的结构来看Factory只要包含一个根据条件创建对象的方法CreateFunction(),Context类需要定义自己的构造函数,和一个实现具体功能的方法。
简单工厂中包含了必要的逻辑判断,根据客户端选择条件动态实例化相关的类。策略模式中具体的策略类要在客户端判断,然后再上下文类中调用方法。
简单工厂代码如下:
{
public static Function CreateObject(string condition)
{
Function ft = null;
switch condition:
case conditionA:
{
ft = new FunctionA();
break;
}
case conditionB:
{
ft = new FunctionB();
break;
}
}
}
public calss Function
{
public virtual void DoSomething()
{
.... ....
}
}
public class FunctionA:Function
{
public void override DoSomething()
{
.... ...
}
}
public calss FuctionB:Function
{
public void override DoSomething()
{
.... ....
}
}
public static void main()
{
string condition = "asdfasdf";
Function fc = Factory.CreateObject(condition);
fc.DoSomething();
}
策略模式代码如下:
{
private Strategy st;
public Context(Strategy st)
{
this.st = st;
}
public void DoStragegyWork()
{
st.DoSomeWork();
}
}
abstract class Strategy
{
public abstract void DoSomeWork();
}
public class StrategyA:Strategy
{
public override void DoSomeWork()
{ A... ... }
}
public class StrategyB:Strategy
{
public override void DoSomeWork()
{ B... ... }
}
public static void main(string args[])
{
StrategyB sb = new StrategyB();
Context ct = new Context(sb);
ct.DoStragegyWork();
}
可以让策略模式和简单工厂模式结合起来,让new Context(sb);这个构造方法接受一个条件变量,在方法体中根据这个变量产生具体的类来实例化。
具体方法如下:
{
private Strategy st;
public Context(string condition)
{
switch("conditionA")
this.st = new StrategyA();
break;
switch("conditionB")
this.st = new StrategyB();
break;
default:
break;
}
public void DoStragegyWork()
{
st.DoSomeWork();
}
}
abstract class Strategy
{
public abstract void DoSomeWork();
}
public class StrategyA:Strategy
{
public override void DoSomeWork()
{ A... ... }
}
public class StrategyB:Strategy
{
public override void DoSomeWork()
{ B... ... }
}
public static void main(string args[])
{
StrategyB sb = new StrategyB();
Context ct = new Context(sb);
ct.DoStragegyWork();
}
哪位大侠可以举个在项目中的运用,贴点简单的代码看看,先谢谢了。我这些都是从书本里得来的。
简单工厂模式和策略模式的区别相关推荐
- android工厂模式和策略模式,android 源码设计模式读书笔记(四)工厂模式和策略模式...
把这两个一起写 因为他们两个UML的代码接口非常的相似 工厂模式代码结构图 image.png 策略模式UML image.png 在我们看完结构图后 感觉位移不同的就是Factory个Context ...
- 工厂模式与策略模式之区别
设计模式有很多种,其中功能相似的很多,但是为什么还要分这么多种名字,查阅资料,我觉得下面的解释最为合理:用途不一样,名字就有区别,一把斧头用来砍人就叫凶器,用来砍柴就叫伐木斧,用来劈门就叫消防斧,这些 ...
- 策略模式和工厂模式的区别_java设计模式之状态模式,策略模式孪生兄弟
状态模式 状态模式(State Pattern)中,类的行为是基于它的状态改变的,状态之间的切换,在状态A执行完毕后自己控制状态指向状态B,状态模式是不停的切换状态执行.这种类型的设计模式属于行为型模 ...
- 设计模式(1)--简单工厂模式、策略模式
设计模式(1)--简单工厂模式.策略模式 1. 简单工厂模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static ...
- 【设计模式2_工厂模式、策略模式】
工厂模式 工厂模式与策略模式通常可以配合使用,成对出现,也是初学设计模式时常常分不清二者区别的原因. 简单工厂 业务场景需要根据传入的不同参数以获取对应的对象来处理各自的逻辑,很容易写出如下代码: v ...
- Java设计模式(方法工厂类、单例模式、代理模式、策略模式、适配器、观察者、装饰类等)
目录 一.简单工厂模式(Factory Method) 二.工厂方法模式 三.抽象工厂模式(Abstract Factory) 3.1 三个工厂模式区别: 四.单例模式(Singleton) 1.饿汉 ...
- 设计模式之桥梁模式和策略模式的区别
桥接(Bridge)模式是结构型模式的一种,而策略(strategy)模式则属于行为模式.以下是它们的UML结构图. 桥梁模式: 策略模式: 在桥接模式中,Abstraction通过聚合的方式引用Im ...
- 设计模式学习笔记(二)工厂模式、模板模式和策略模式的混合使用
一.工厂模式(Factory pattern) 工厂模式又叫做工厂方法模式,是一种创建型设计模式,一般是在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型. 1.1 工厂模式介绍 工厂模式是 ...
- 拿捏大厂面试,设计模式学习笔记(二)工厂模式、模板模式和策略模式的混合使用
一.工厂模式 工厂模式又叫做工厂方法模式,是一种创建型设计模式,一般是在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型. 1.1 工厂模式介绍 工厂模式是Java 中比较常见的一种设计模式 ...
- 工厂模式和策略模式的综合使用
目录 一.简单的工厂模式了解与使用 (一)基本概念理解 (二)简单工厂模式的认识和对应角色的分析 基本认识 角色理解 (三)使用场景和典型应用 二.简单的策略模式了解与使用 (一)基本概念理解 (二) ...
最新文章
- 有趣的物理照片,让你瞬间爱上物理!
- 北大CIO走进龙泉寺交流研讨会圆满举行
- 前端学习(1258):then参数中的函数返回值
- JConsole连接远程linux服务器配置
- 转为yaml python_python 如何使用HttpRunner做接口自动化测试
- cmd命令java出错_Java基础知识_JavaSE_02
- 第四章 Linux命令
- 专门查英语单词的软件_查英语单词的软件_有道翻译
- 米思齐Mixly图形化编程---RFID智能门禁
- c java gs_Java基础-gs(垃圾回收)
- 微信语音聊天内容如何录制 如何录制通话内容
- Mysql引擎之MyISAM引擎
- ipms综合管理系统的总结2
- python翻译成中文_Python调用有道智云文本翻译API接口实现“智能”伪原创
- 软件实施工程师面试总结
- BUAA 439 孟竹屌丝玩儿游戏
- DeepMind新作 | 给我1张图,生成30秒视频!
- Merkle Patricia Tree 梅克尔帕特里夏树(MPT)详细介绍
- 货币基金为何火:“穷人”也有高收益
- 中国31省市区42部门投入产出表(1997-2017年)
热门文章
- 单线程多线程_理解线程,就会由单线程向多线程进军
- kettle安装,启动spoon之后一闪就没了问题
- echarts设置标题样式_Pyecharts 全局配置项之标题配置项
- 符号_液压图形符号识别之流量控制阀符号原理
- 基于京东家电商品知识图谱的自动问答系统(二) -- IDEA搭建开发环境
- 完美解决SpringMVC中静态资源无法找到(No mapping found for HTTP request with URI)问题...
- Legal or Not
- shell md5sum
- 迄今为止最全:Oracle WebLogic Server产品版本介绍
- Java------String DAte 转化