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