设计模式之六个创建型模式

设计模式之六个创建型模式

工厂模式

简单工厂模式

简单工厂模式
UML图
简单工厂模式的主要优点如下:

  1. 工厂类包含必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的职责,而仅仅“消费”产品,简单工厂模式实现了对象创建和使用的分离。
  2. 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以在一定程度减少使用中的记忆量

主要缺点:

  1. 由于工厂类集中了所有产品的创建逻辑,职责过重,一旦不能正常工作,整个系统都要受到影响
  2. 使用简单工厂类模式势必增加系统中类的个数
  3. 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂。

工厂方法模式

工厂方法模式
UML图
工厂方法模式的主要优点如下:

  1. 在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了那种具体产品类将被实例化这一细节,用户只需要关心所需产品对应的工厂,无需关心创建细节,甚至无需知道具体产品类的类名。
  2. 基于工厂角色和产品角色的多态设计是工厂方法模式的关键。它能够让工厂可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部
  3. 使用工厂方法模式的另一优点是在系统中加入新产品时,无须修改抽象工厂和抽象产品提供的接口,无须修改客户端,也无须修改其他的具体工厂和具体产品。而只要添加一个具体工厂和具体产品就可以了,这样,系统的可扩展性也就变得非常好,完全符合“开闭原则”。

    主要缺点

  4. 在添加新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数将成对增加,在一定程度上增加系统的复杂度,有更多类需要编译和运行,会给系统带来一些额外开销

抽象工厂模式

抽象工厂模式为创建一组对象提供了一种解决方案。与工厂方法模式相比,抽象工厂模式中具体工厂不只是创建一种产品。它负责创建一族产品。
UML图

抽象工厂模式的主要优点如下:

  1. 抽象工厂模式隔离了具体类的生成,使得客户并不知道什么被创建。
  2. 当产品族中的多个对象呗设计成一起工作时,它能够保证客户端始终只使用同一个产品族的对象
  3. 增加产品族很方便,无须修改已有系统,符合“开闭原则”

主要缺点:
增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来比较大的不便

单例模式

单例模式应该是用的最多也是比较简单的一种设计模式,实现方式有很多,分懒汉和饿汉,饿汉模式实现简单,在类中设置静态成员变量,并初始化为类的对象,提供静态方法访问此成员变量;懒汉模式将对象初始化放在静态方法调用时,这样当真正需要此实例时才进行对象初始化,节省资源。
但懒汉模式在多线程情况下会遇到很多麻烦,可能会初始化多个实例。为此可以使用静态内部类来实现。

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方法是浅拷贝,类中存在引用类型时,拷贝出来的对象中的引用成员变量与原对象中的一样。因此需要实现深拷贝。

建造者模式

建造者模式将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
UML图

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值