大话设计模式读书笔记(一)简单工厂

一、面向对象的好处:可维护,可复用,可扩展,灵活性好。

 

二、具体事例:计算器

      1、类结构图:

大话设计模式读书笔记(一)简单工厂_第1张图片

    2、实例代码:

 

Operation运算类(OperationLibrary.Operation.cs)

using System; using System.Collections.Generic; using System.Text; namespace OperationLibrary { /// <summary> /// 运算类 /// </summary> public class Operation { private double _numberA = 0; private double _numberB = 0; /// <summary> /// 数字A /// </summary> public double NumberA { get { return _numberA; } set { _numberA = value; } } /// <summary> /// 数字B /// </summary> public double NumberB { get { return _numberB; } set { _numberB = value; } } /// <summary> /// 得到运算结果 /// </summary> /// <returns></returns> public virtual double GetResult() { double result = 0; return result; } /// <summary> /// 检查输入的字符串是否准确 /// </summary> /// <param name="currentNumber"></param> /// <param name="inputString"></param> /// <returns></returns> 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; } } /// <summary> /// 加法类 /// </summary> class OperationAdd : Operation { public override double GetResult() { double result = 0; result = NumberA + NumberB; return result; } } /// <summary> /// 减法类 /// </summary> class OperationSub : Operation { public override double GetResult() { double result = 0; result = NumberA - NumberB; return result; } } /// <summary> /// 乘法类 /// </summary> class OperationMul : Operation { public override double GetResult() { double result = 0; result = NumberA * NumberB; return result; } } /// <summary> /// 除法类 /// </summary> class OperationDiv : Operation { public override double GetResult() { double result = 0; if (NumberB == 0) throw new Exception("除数不能为0。"); result = NumberA / NumberB; return result; } } /// <summary> /// 平方类 /// </summary> class OperationSqr : Operation { public override double GetResult() { double result = 0; result = NumberB * NumberB; return result; } } /// <summary> /// 平方根类 /// </summary> class OperationSqrt : Operation { public override double GetResult() { double result = 0; if (NumberB < 0) throw new Exception("负数不能开平方根。"); result = Math.Sqrt(NumberB); return result; } } /// <summary> /// 相反数类 /// </summary> class OperationReverse : Operation { public override double GetResult() { double result = 0; result = -NumberB; return result; } } /// <summary> /// 运算类工厂 /// </summary> 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; } } }

 

 

计算器控制台(Program.cs)

using System; using System.Collections.Generic; using System.Linq; using System.Text; using Simple_Factory; namespace 计算器控制台 { class Program { static void Main(string[] args) { try { Operation ope; Console.WriteLine("请输入第一个操作数"); string _strA = Console.ReadLine(); Console.WriteLine("请输入操作符"); string _operate = Console.ReadLine(); Console.WriteLine("请输入第二个操作数"); string _strB = Console.ReadLine(); ope = OperationFactory.createOperate(_operate); ope.NumberA = Convert.ToDouble(_strA); ope.NumberB = Convert.ToDouble(_strB); double result = ope.GetResault(); Console.WriteLine("运算结果是:" + result.ToString()); } catch (Exception exp) { Console.WriteLine("您输入的结果有误:" + exp.Message); } } } }

 

 

 计算器窗体(Form1.cs)

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using OperationLibrary; namespace 计算器 { /// <summary> /// 面向对象编程 /// 1、加运算类 /// 2、加运算子类 /// 3、加运算类工厂 /// 4、更改Form1 public partial class Form1 : Form { bool bOperate = false; Operation oper; public Form1() { InitializeComponent(); } private void button0_Click(object sender, EventArgs e) { if (bOperate) { txtShow.Text = ""; bOperate = false; } string number = ((Button)sender).Text; txtShow.Text = Operation.checkNumberInput(txtShow.Text, number); } private void buttonClear_Click(object sender, EventArgs e) { txtShow.Text = ""; } private void buttonAdd_Click(object sender, EventArgs e) { if (txtShow.Text != "") { oper = OperationFactory.createOperate(((Button)sender).Text); oper.NumberA = Convert.ToDouble(txtShow.Text); bOperate = true; } } private void buttonEqual_Click(object sender, EventArgs e) { if (txtShow.Text != "") { if (((Button)sender).Text != "=") { oper = OperationFactory.createOperate(((Button)sender).Text); } oper.NumberB = Convert.ToDouble(txtShow.Text); txtShow.Text = oper.GetResult().ToString(); bOperate = true; } } private void Form1_Load(object sender, EventArgs e) { } } }

 

 

3、Form1设计视图

 

大话设计模式读书笔记(一)简单工厂_第2张图片

 

4、如果我们某一天要修改加法运算,只需要修改OperationAdd。如果我们要增加或删除某些运算只需要增加或删除相应的子类和工厂类里的switch分支就好了。

 

简单工厂模式

  
   大话设计模式读书笔记(一)简单工厂_第3张图片

  

基本简介   从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种 GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。    实现方式(附图)   简单工厂模式的UML类图(见右图)   简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。   该模式中包含的角色及其职责    工厂( Creator )角色   简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。    抽象( Product )角色   简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。    具体产品( Concrete Product )角色   是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。   一般来讲它是抽象产品类的子类,实现了抽象产品类中定义的所有接口方法。    优缺点    优点   工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。    缺点   由于工厂类集中了所有实例的创建逻辑,违反了 高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;   当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;   这些缺点在 工厂方法模式中得到了一定的克服。    使用场景   工厂类负责创建的对象比较少;   客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;   由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。

你可能感兴趣的:(大话设计模式读书笔记(一)简单工厂)