设计模式之六个创建型模式
工厂模式
简单工厂模式
简单工厂模式
简单工厂模式的主要优点如下:
- 工厂类包含必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的职责,而仅仅“消费”产品,简单工厂模式实现了对象创建和使用的分离。
- 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以在一定程度减少使用中的记忆量
主要缺点:
- 由于工厂类集中了所有产品的创建逻辑,职责过重,一旦不能正常工作,整个系统都要受到影响
- 使用简单工厂类模式势必增加系统中类的个数
- 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂。
工厂方法模式
工厂方法模式
工厂方法模式的主要优点如下:
- 在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了那种具体产品类将被实例化这一细节,用户只需要关心所需产品对应的工厂,无需关心创建细节,甚至无需知道具体产品类的类名。
- 基于工厂角色和产品角色的多态设计是工厂方法模式的关键。它能够让工厂可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部
使用工厂方法模式的另一优点是在系统中加入新产品时,无须修改抽象工厂和抽象产品提供的接口,无须修改客户端,也无须修改其他的具体工厂和具体产品。而只要添加一个具体工厂和具体产品就可以了,这样,系统的可扩展性也就变得非常好,完全符合“开闭原则”。
主要缺点
在添加新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数将成对增加,在一定程度上增加系统的复杂度,有更多类需要编译和运行,会给系统带来一些额外开销
抽象工厂模式
抽象工厂模式为创建一组对象提供了一种解决方案。与工厂方法模式相比,抽象工厂模式中具体工厂不只是创建一种产品。它负责创建一族产品。
抽象工厂模式的主要优点如下:
- 抽象工厂模式隔离了具体类的生成,使得客户并不知道什么被创建。
- 当产品族中的多个对象呗设计成一起工作时,它能够保证客户端始终只使用同一个产品族的对象
- 增加产品族很方便,无须修改已有系统,符合“开闭原则”
主要缺点:
增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来比较大的不便
单例模式
单例模式应该是用的最多也是比较简单的一种设计模式,实现方式有很多,分懒汉和饿汉,饿汉模式实现简单,在类中设置静态成员变量,并初始化为类的对象,提供静态方法访问此成员变量;懒汉模式将对象初始化放在静态方法调用时,这样当真正需要此实例时才进行对象初始化,节省资源。
但懒汉模式在多线程情况下会遇到很多麻烦,可能会初始化多个实例。为此可以使用静态内部类来实现。
class Singleton {
private Singleton() {
}
private static class HolderClass {
private final static Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return HolderClass.instance;
}
public static void main(String args[]) {
Singleton s1, s2;
s1 = Singleton.getInstance();
s2 = Singleton.getInstance();
System.out.println(s1==s2);
}
}
原型模式
原型模式就是将自己拷贝来实现创建过程。可直接调用object类提供的clone方法,但是需要注意这个clone方法是浅拷贝,类中存在引用类型时,拷贝出来的对象中的引用成员变量与原对象中的一样。因此需要实现深拷贝。
建造者模式
建造者模式将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。