设计模式总结之二创建型模式

来源:互联网 发布:《啊哈 算法》epub 编辑:程序博客网 时间:2024/05/22 18:21

 

创建型模式

 

     创建型模式,就是创建对象的模式,抽象了实例化的过程。它帮助一个系统独立于如何创建、组合和表示它的那些对象。关注的是对象的创建,创建型模式将创建对象的过程进行了抽象,也可以理解为将创建对象的过程进行了封装,作为客户程序仅仅需要去使用对象,而不再关心创建对象过程中的逻辑

    创建型模式隐藏了类的实例是如何被创建和和在一起的,使用端只与这些对象所抽象出来的接口相关联,创建型模式在创建什么、谁创建,怎么被创建,以及何时创建这些方面,为使用端提供了很大的灵活性。

在通常的对象创建设计中,应该从工厂方法开始,如果需要更强灵活性时,再选择其实的模式进行对象创建。

 

一、单例模式

 

单例模式

作用:保证一个类仅有一个实例。

要点:

1、定义私有、静态全局变量对象 :privatestatic Singletoninstance

2、私有化构造函数,以限制对象创建:private Singleton()

3、提供获取对象实例的静态方法 :publicstatic Singleton getInstance()

备注:

 如果多线程访问,应该对getInstance()加上同步锁synchronized如果只在创建时加同步锁,可以使用双重锁定的方法创建,具体代码如下:

public static Singleton getInstance() {       if (instance == null) {           synchronized (Singleton.class) {              if (instance == null) {                  instance = new Singleton();              }           }       }       return instance;}

 

 二、原型模式

 

原型模式

作用:

通过复制自身,创建新对象,在创建过程中不需要额外的创建细节。使用原型模式创建对象比直接new在性能上要好的多,因为Object类的clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。

因为以上优点,所以在需要重复地创建相似对象时可以考虑使用原型模式。比如在一个循环体内创建对象,假如对象创建过程比较复杂或者循环次数很多的话,使用原型模式不但可以简化创建过程,而且可以使系统的整体性能提高很多。

要点一:

1、通过实现Cloneable接口实现原型形式对象的拷贝 。

2、重写Object类中的clone方法。并将clone方法的作用域修改为public类型。              

要点二:

实现Serializable接口,通过流读写的方式复制对象。如下所示

public Object deepCopy() throws Exception  {       ByteArrayOutputStream bos = new ByteArrayOutputStream();              ObjectOutputStream oos = new ObjectOutputStream(bos);              oos.writeObject(this);              ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());              ObjectInputStream ois = new ObjectInputStream(bis);              return ois.readObject();   }}


 

备注:

1、使用原型模式复制对象不会调用类的构造方法。因为对象的复制是通过调用Object类的clone方法,直接在内存中复制数据,因此不但构造方法中的代码不会执行,甚至连访问权限都对原型模式无效。而在单例模式中需要将构造方法设置为private实现单例以限制对象的创建。所以,单例模式与原型模式是冲突的,在使用时要特别注意

2、Object类的clone方法只会深拷贝8种基本类型以及他们的封装类型和String类型。其余的都是浅拷贝,只拷贝对象的引用。因此像原型模式中的数组、容器对象、引用对象等需要在clone方法中,自行实现深拷贝操作。 

 

三、建造者模式

 

 

作用:

将一个对象的构建与它的表示分享,使得同样的构建过程可以创建不同的表示。

要点:

1Designer中定义Builder的组成顺序或算法。Builder一般都有统一步聚,如:stepOne()stopTwo()等。

2Builder通过将自身传入Designer中,改变自身Product属性,客户端通过调用getProduct(),返回经过Designer改变的Product

备注:

建造者模式是当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方法时适用的模式。

 

四、简单工厂(违反开闭原则,严格讲非设计模式)

 

4. 简单工厂模式

 

作用:

简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说去除了与具体产品的依赖。

要点:

Factory类中的getProductint type方法根据传入的参数决定初始化哪个Product对象

备注:

简单工厂方法违法了开闭原则,当需要增加一个产品时,需要客户端Factory类也做相应的修改。简单工厂只有一个具体工厂类来生产同一个产品的不同实现类

 

五、工厂方法模式

 

工厂方法模式

 

作用:

定义一个用于创建对象的工厂接口,让工厂子类决定实例化哪一个具体类,工厂模式使具体类的实例化延迟到其工厂子类中。

要点:

客户端根据需要,决定初始化哪个工厂来创建Product对象。相当于把简单工厂的内部逻辑判断移到了客户端代码中,如果想要修改或增加功能,本来是修改工厂类的,现在是修改客户端。

备注:

工厂方法模式是简单工厂模式的进一步抽象和推广,保留了简单工厂的优点同时克服了简单工厂违反封闭性原则的缺点。工厂方法模式有多个基于同一个工厂接口的不同工厂实现类,每个工厂实现类只生产一种产品接口的具体实现类。

 

六、抽像工厂模式

 

抽像工厂模式

 

作用:

提供一个创建一系列或相关依赖对象的接口,而无需指定它们具体的类。

要点:

1Factory接口定义了工厂主要生产ProductOneProductTwo两种产品。

2、通过Factory的不同实现定义产品线FactoryImpl和产品线FactoryImpl2,并关联不同的ProductOnImplProductTwoImpl从而实现生产不同的ProductOneProductTwo产品。

备注:

抽象工厂可以与简单工厂进行结合,通过使用配置文件和反射实现替代FactoryfactoryImpl来初始化不同的产品对象,从而简化抽象工厂的实现。抽象工厂有多个基于同一个工厂接口的工厂实现类,每个具体工厂实现类生产多种产品接口的具体实现类。


原创粉丝点击