帮你整理了一份设计模式速查手册 (2)

套路3:上面的已经完全实现了单例模式,但还有一个更简单的方式-静态初始化。CLR会在类加载时初始化静态字段,且是线程安全的,所以可以把类实例化放在静态字段上。

public sealed class Singleton
{
    private static readonly Singleton instance = new Singleton();
    private Singleton()
    
{  
    }
    public static Singleton GetSingleton()
    
{
        return instance;
    }
}

这种称之为饿汉式单例,类一加载就实例化对象。前面的是懒汉式,在第一次引用时实例化。

2、Factory Method工厂方法

简单工厂模式:什么是工厂?现实中就是生产东西的地方,程序里也是,就是有一个单独的地方(类)来负责创建各种实例
以经典的加减乘除计算程序为例,如果按照面向过程流程开发,大概步骤就是用户输入数字1,然后输入运算符,输入数字2,然后根据运算符if或switch判断调用哪个数学方法,这种没有面向对象,都在一起,耦合太紧(代码就不贴了,都是过来人)

先看一下使用简单工厂模式之后的类图

帮你整理了一份设计模式速查手册

 

把加减乘除各个运算操作封装成单独类,都继承自运算类,共用基类的成员变量AB,重写GetResult获取运算结果方法。封装之后,提供一个简单工厂类,通过传入不同的操作符,实例化不同的操作运算类。这样增加新的操作运算符时只需要修改工厂就行。(增加一个流水线)

简单工厂类核心:

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 "http://www.likecs.com/":
                oper = new OperationDiv();
                break;
        }
        return oper;
    }
}

工厂方法模式:对简单工厂模式的进一步抽象。简单工厂是要求把逻辑放在在工厂类中,新增需要修改case分支,违背了开放封闭原则。工厂方法模式进一步在工厂上做文章,定义一个创建对象的接口,让子类决定实例化哪一个类。

帮你整理了一份设计模式速查手册

工厂部分像下面这样

interface IFactory
{
    Operation CreateOperation() ;
}

class AddFactory : IFactory
{
    public Operation CreateOperation()
    
{
        return new OperationAdd();
    }
}

class SubFactory : IFactory
{
    public Operation CreateOperation()
    
{
        return new OperationSub();
    }
}

客户端调用像下面这样。如果增加操作运算符,增加相应的运算类和工厂,不需要像简单工厂那样修改工厂类内的逻辑。

IFactory operFactory = new AddFactory();
Operation oper = operFactory.CreateOperation();
3、Abstract Factory抽象工厂

抽象工厂模式和工厂方法类似。它是提供一个创建一系列对象的工厂接口,无需指定它们具体的类。我们看下结构图

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdydg.html