大话设计模式-简单工厂模式-2020-09-08

面向对象的好处

通过活字印刷的例子,来说明面向对象的好处。

  1. 可维护: 要改,只需要改要改之字,其他的不用动;
  2. 可复用: 这些字并非用完这次就无用,完全可以在后来的印刷中重复使用;
  3. 可扩展: 若是要加字,只需要另刻字加入即可;
  4. 灵活性好: 字的排列可能是竖排,也可能是横排,此时只需要将活字移动就可以满足需求;
  • 通过封装、继承、多态把程序的耦合度降低;

  • 用设计模式使得程序更加的灵活,容易修改,并且易于复用

计算器的例子

简单工厂模式,用一个单独的类来进行这个创造实例的过程,这就是工厂。将运算符号输入工厂,得到对应的运算子类,通过多态,直接使用父类的getResult方法实际上是子类的getResult方法。

简单工厂
  1. 封装:基类用来对业务进行封装,比如运算类Operation
    ///Operation运算类
    public class Operation
    {
        public double NumberA { get; set; }

        public double NumberB { get; set; }

        public virtual double GetResult()
        {
            double result = 0;
            return result;
        }
    }
  1. 继承:派生类实现各种具体业务场景,比如加、减、乘、除各种具体的运算
///加减乘除类
    ///加法类
    public class OperationAdd : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = this.NumberA + this.NumberB;
            return result;
        }
    }
    ///减法类
    public class OperationSub : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = this.NumberA - this.NumberB;
            return result;
        }
    }

    /// 
    /// 乘法类
    /// 
    public class OperationMul : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = this.NumberA * this.NumberB;
            return result;
        }
    }

    /// 
    /// 除法类
    /// 
    public class OperationDiv : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            if (this.NumberB == 0)
            {
                throw new Exception("除数不能为0。");
            }
            result = this.NumberA / this.NumberB;
            return result;
        }
    }
  1. 多态:简单工厂类,根据条件,创建符合条件的派生类。比如这里用+-*/的字符代表加减乘除等派生类。
    ///简单工厂类
    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;
            }
            return Oper;
        }
    }

简单工厂是一种派生类实例集中创建的方法。这是一个非常体现面向对象封装、继承、多态等特性的例子。

设计模式之二(简单工厂模式)

UML 类图

UML例子
  • 继承: 空心三角形+实线;箭头指向为被继承的,也就是父类;
    实现接口: 空心三角形和虚线;箭头指向为被实现的,也就是接口;
继承
实现接口
  • 关联: 实线剪头;一般作为属性成员,箭头指向属性;
    依赖: 虚线箭头;一般作为方法的参数,箭头指向参数;
关联
依赖
  • 聚合: 空心的菱形加箭头;群体和个体的关系;菱形指向群体;箭头指向个体;群体中包含一个数组,数组成员是个体
    组合: 实心的菱形加箭头;整体和部分的关系;菱形指向整体;箭头指向部分;部分作为整体的一个属性成员,并且在构造函数中同时构造;
聚合
组合

单向关联用箭头,双向不用。

image.png

Demo

这是用Android写的大话设计模式里面的例子
https://gitee.com/zhangxusong888/Android/tree/master/design_pattern

参考文章

大话设计模式第一章之:工厂模式
设计模式之前奏(UML类图)
大话设计模式阅读笔记

你可能感兴趣的:(大话设计模式-简单工厂模式-2020-09-08)