1、简单工厂模式/静态工厂方法
定义:简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。
UML:
PS:这个设计模式太简单了,没什么好解说的,简单来说就是通过传入一个标识到工厂类方法中,返回相应的具体产品。
2、工厂方法模式
定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使得一个类的实例化延迟到其子类。
UML:
PS:简单工厂模式的优点在于工厂类中包含了必要的逻辑判断,根据客户端传入的标识来动态实例化相应的类。
工厂方法模式是把简单工厂的内部逻辑判断,移到了客户端进行,由客户端调用具体的工厂类ConcreteFactory去生成相应的具体产品ConcreteProduct。如上面UML中所示,每一种产品都有相应的工厂类ConcreteFactory,有多少种产品就有多少个工厂类ConcreteFactory。
3、抽象工厂模式(Abstract Factory)
定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
UML:
PS:比如我们的系统需要同时支持Oracle和MSSql,那我们可以把上面UML中的ProductA1看做是对Oracle数据库的操作,ProductA2看做是对MSSql数据库的操作,这时使用抽象工厂模式的好处时,如果哪天需要把MSSql数据库切换成Oracle数据库时,就只需要更改使用到ConcreteFactory的地方就可以。此模式主要利用的就是面向接口编程的优点。该模式可以配合简单工厂模式,或用反射+配置文件的方式来进一步优化。
4、建造者模式(Builder)
定义:建造者模式又称生成器模式,它将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
UML:
PS:具体建造者类ConcreteBuilder.BuildPart()只建造成品的特定组件,ConcreteBuilder中可能有多个BuildPart()去建造各种组件,然后具体成品的组装则由Director来完成。我第一反应是觉得Director完全没有存在的必要,直接都由建造者来完成就可以了,但再想想时觉得,这也许就是减耦建造组件和组装组件的耦合。至于是把代码放在同一个类中或多个类中不一定就对模式有破坏性。
参考代码:
应用场景类比:建造胖瘦小人
5、原型模式(Prototype)
定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
UML:
PS:原型类中定义一个方法来克隆自身,可以实现ICloneable接口来完成原型模式。
应用场景类比:简历复制
6、单例模式(Singleton)
定义:保证一个类只有一个实例,并提供一个访问它的全局访问点。
UML:
PS:单例模式应该是平时应用比较多的一种模式,该模式主要在于把构造函数设置为私有,并提供一个可供全局访问的点。虽然说常用,但还是有两点值得一提的。一是单例类声明为sealed,以防止派生增加实例的风险,二是多线程中使用时要双重锁定。这种实现方式是我之前常用,这种方式被称为赖汉式单例类,因为它只有第一次被引用时,才取实例化。另外还有一种饿汉式单例类,它是把instance设置为静态,并在声明赋值时实例化,这种”静态初始化“方法就不需要考虑多线程的问题。这两种方式各有利弊吧,看实际需求取舍吧。