《大话设计模式》--雷锋依然在人间--工厂方法模式<Factory Method>(8)
来源:互联网 发布:如何看待网络暴力演讲 编辑:程序博客网 时间:2024/05/18 23:54
简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
FM:定义了用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
计算器的工厂方法模式UML:
代码如下:
interface IFactory { Operation CreateOperation(); }
public class Operation { public double Num1 { get; set; } public double Num2 { get; set; } public virtual double Operate() { double result = 0d; return result; } }
class OperationAdd : Operation { public override double Operate() { double result = 0d; result = Num1 + Num2; return result; } }
class OperationSubtract:Operation { public override double Operate() { double result = 0d; result = Num1 - Num2; return result; } }
class OperationMultiply:Operation { public override double Operate() { double result = 0d; result = Num1 * Num2; return result; } }
class OperationDivide:Operation { public override double Operate() { double result = 0d; if (Num2 != 0) { result = Num1 / Num2; } return result; } }
工厂方法模式:
class AddFactory:IFactory { public Operation CreateOperation() { return new OperationAdd(); } }
class SubtractFactory:IFactory { public Operation CreateOperation() { return new OperationSubtract(); } }
class MultiplyFactory:IFactory { public Operation CreateOperation() { return new OperationMultiply(); } }
class DevideFactory:IFactory { public Operation CreateOperation() { return new OperationDivide(); } }
客户端代码:
IFactory ifactory = new AddFactory(); Operation ope = ifactory.CreateOperation(); ope.Num1 = 2; ope.Num2 = 3; double result = ope.Operate(); Console.WriteLine(result);
总结:工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。你想要加功能,本来是改工厂类,而现在是修改客户端。
雷锋工厂方法模式:
下面是UML图:
interface ILeiFengFactory { LeiFeng CreateLeiFeng(); }
class LeiFeng { public void Sweep() { Console.WriteLine("扫地"); } public void Wash() { Console.WriteLine("洗衣"); } public void BuyRice() { Console.WriteLine("买米"); } }
class Undergraduate:LeiFeng { }
class Volunteer:LeiFeng { }
class UndergraduateFactory:ILeiFengFactory { public LeiFeng CreateLeiFeng() { return new Undergraduate(); } }
class VolunteerFactory:ILeiFengFactory { public LeiFeng CreateLeiFeng() { return new Volunteer(); } }
客户端代码:
ILeiFengFactory factory = new UndergraduateFactory(); LeiFeng lf = factory.CreateLeiFeng(); lf.BuyRice(); lf.Sweep(); lf.Wash();
0 0
- 《大话设计模式》--雷锋依然在人间--工厂方法模式<Factory Method>(8)
- 《大话设计模式》之--第8章 雷锋依然在人间----工厂方法模式
- 《大话设计模式》之--第8章 雷锋依然在人间----工厂方法模式
- 第8章 雷锋依然在人间-工厂方法模式 大话设计模式
- 8. 雷锋依然在人间 -- 工厂方法模式(Factory Method Pattern)
- 【设计模式】雷锋依然在人间 --- 工厂方法模式
- 《大话设计模式》—— 读后感(8)雷锋依然在人间——工厂方法模式
- 大话设计模式-第08章 雷锋依然在人间--工厂方法模式
- 《大话设计模式》——读后感 (5)雷锋依然在人间?——工厂方法模式
- 雷锋依然在人间 --- 工厂方法模式
- 工厂方法模式Python版--雷锋依然在人间
- 雷锋依然在人间—工厂方法模式
- 大话设计模式八:工厂方法模式(factory method)
- 大话设计模式--工厂方法模式 Factory Method -- C++实现
- 第八章 雷锋依然在人间-工厂方法模式(读书笔记)
- 第八章 雷锋依然在人间---工厂方法模式(读书笔记)
- 设计模式-工厂方法模式(factory method)
- 设计模式-工厂方法模式(Factory Method)
- Ajax提交请求后台获取不到session中的值
- PreTranslateMessage作用和使用方法
- ACM在线练习-括号配对问题
- 一个01字符串,求出现0、1出现次数相等的最长子串
- 关于获取操作系统版本的方法
- 《大话设计模式》--雷锋依然在人间--工厂方法模式<Factory Method>(8)
- hdu5246超级赛亚ACMer
- 如何获取连接的wifi密码
- 屏蔽runtime error等错误的弹出框
- openTSDB ConnectionManager: Unexpected exception from downstream java.io.IOException: Broken pipe
- Android Log系统详解
- ios AFNetworking 实用篇
- 修改 mysql 的字符编码
- C#Graphics类绘制直线与拖动