小菜学设计模式 工厂设计模式 Simple Factory Pattern
2009-10-20 23:06
806 查看
设计模式的工厂设计模式。 工厂模式有以下几种形态:
简单工厂(Simple Factory)模式
工厂方法(Factory Method)模式
抽象工厂(Abstract Factory)模式
优点:
工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅"消费"产品。简单工厂模式通过这种做法实现了对责任的分割。
缺点:
当产品有复杂的多层等级结构时,工厂类只有自己,以不变应万变,就是模式的缺点。因为工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
同时,系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,有可能造成工厂逻辑过于复杂。
另外,简单工厂模式通常使用静态工厂方法,这使得无法由子类继承,造成工厂角色无法形成基于继承的等级结构。以上描述来自:C#设计模式(4)-Simple Factory Pattern
前台调用时使用:
操作实体类Operation和运算类工厂:
参考学习:C#设计模式(4)-Simple Factory Pattern
简单工厂(Simple Factory)模式
工厂方法(Factory Method)模式
抽象工厂(Abstract Factory)模式
优点:
工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅"消费"产品。简单工厂模式通过这种做法实现了对责任的分割。
缺点:
当产品有复杂的多层等级结构时,工厂类只有自己,以不变应万变,就是模式的缺点。因为工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
同时,系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,有可能造成工厂逻辑过于复杂。
另外,简单工厂模式通常使用静态工厂方法,这使得无法由子类继承,造成工厂角色无法形成基于继承的等级结构。以上描述来自:C#设计模式(4)-Simple Factory Pattern
前台调用时使用:
class Program { static void Main(string[] args) { try { Console.Write("请输入数字A:"); string strNumberA = Console.ReadLine(); Console.Write("请选择运算符号(+、-、*、/):"); string strOperate = Console.ReadLine(); Console.Write("请输入数字B:"); string strNumberB = Console.ReadLine(); string strResult = ""; Operation oper; oper = OperationFactory.createOperate(strOperate); oper.NumberA = Convert.ToDouble(strNumberA); oper.NumberB = Convert.ToDouble(strNumberB); strResult = oper.GetResult().ToString(); Console.WriteLine("结果是:" + strResult); Console.ReadLine(); } catch (Exception ex) { Console.WriteLine("您的输入有错:" + ex.Message); } } }
操作实体类Operation和运算类工厂:
using System; using System.Collections.Generic; using System.Text; namespace OperationLibrary { /// /// 运算类 /// public class Operation { private double _numberA = 0; private double _numberB = 0; /// /// 数字A /// public double NumberA { get { return _numberA; } set { _numberA = value; } } /// /// 数字B /// public double NumberB { get { return _numberB; } set { _numberB = value; } } /// /// 得到运算结果 /// /// public virtual double GetResult() { double result = 0; return result; } /// /// 检查输入的字符串是否准确 /// /// /// /// public static string checkNumberInput(string currentNumber, string inputString) { string result = ""; if (inputString == ".") { if (currentNumber.IndexOf(".") < 0) { if (currentNumber.Length == 0) result = "0" + inputString; else result = currentNumber + inputString; } } else if (currentNumber == "0") { result = inputString; } else { result = currentNumber + inputString; } return result; } } /// /// 加法类 /// class OperationAdd : Operation { public override double GetResult() { double result = 0; result = NumberA + NumberB; return result; } } /// /// 减法类 /// class OperationSub : Operation { public override double GetResult() { double result = 0; result = NumberA - NumberB; return result; } } /// /// 乘法类 /// class OperationMul : Operation { public override double GetResult() { double result = 0; result = NumberA * NumberB; return result; } } /// /// 除法类 /// class OperationDiv : Operation { public override double GetResult() { double result = 0; if (NumberB == 0) throw new Exception("除数不能为0。"); result = NumberA / NumberB; return result; } } /// /// 平方类 /// class OperationSqr : Operation { public override double GetResult() { double result = 0; result = NumberB * NumberB; return result; } } /// /// 平方根类 /// class OperationSqrt : Operation { public override double GetResult() { double result = 0; if (NumberB < 0) throw new Exception("负数不能开平方根。"); result = Math.Sqrt(NumberB); return result; } } /// /// 相反数类 /// class OperationReverse : Operation { public override double GetResult() { double result = 0; result = -NumberB; return result; } } /// /// 运算类工厂 /// public class OperationFactory { public static Operation createOperate(string operate) { Operation oper = null; switch (operate) { case "+": { oper = new OperationAdd(); break; } case "-": { oper = new OperationSub(); break; } case "*": { oper = new OperationMul(); break; } case "/": { oper = new OperationDiv(); break; } case "sqr": { oper = new OperationSqr(); break; } case "sqrt": { oper = new OperationSqrt(); break; } case "+/-": { oper = new OperationReverse(); break; } } return oper; } } }
类似的结构图。
参考学习:C#设计模式(4)-Simple Factory Pattern
相关文章推荐
- 小菜学设计模式 工厂设计模式 Simple Factory Pattern
- 设计模式笔记4:简单工厂模式(Simple Factory Pattern)
- 23种设计模式之-----简单工厂(静态工厂)模式(SimpleFactory Pattern)
- 设计模式最简Demo:简单工厂模式[Simple Factory Pattern]
- 面向对象设计模式之---简易工厂模式(Simple Factory Pattern)
- 简单工厂设计模式(Simple Factory Design Pattern)
- 设计模式简单工厂模式(SimpleFactoryPattern)
- 设计模式笔记之工厂模式--简单工厂模式(Simple Factory Pattern)
- 设计模式 简单工厂(simple factory pattern)转载
- 设计模式 简单工厂(simple factory pattern)
- 设计模式(二)-简单工厂(Simple Factory)模式
- c++设计模式:简单工厂模式(Simple Factory Pattern)
- 简单工厂模式 Simple Factory Pattern
- Net设计模式实例之简单工厂模式(Simple Factory Pattern)
- 简单工厂模式(SimpleFactoryPattern)- 最易懂的设计模式解析
- 设计模式(Design Pattern) - 创建型模式(Creational Pattern) - 简单工厂模式(Simple Factory Pattern) - Java实现
- 设计模式(创建型)之简单工厂模式(Simple Factory Pattern)
- Head First 设计模式之工厂模式(Factory Pattern)
- 解读设计模式----简单工厂模式(SimpleFactory Pattern),你要什么我就给你什么