设计模式-创建型模式

1,工厂模式 

  就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建
  创建一个Persion接口:
public interface Persion {
    public void say();
}

  创建实现Persion接口的2个类:

public class Student implements Persion {
    @Override
    public void say() {
        System.out.println("student");
    }
}
public class Teacher implements Persion {
    @Override
    public void say() {
        System.out.println("Teacher");
    }
}

  创建一个工厂类:

public class PersionFactory {
    public static Persion createStudent(){
        return new Student();
    }
    public static Teacher createTeacher(){
        return new Teacher();
    }
}    

  测试:

    

  结果:

    

2,抽象工厂模式
    刚才工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,抽象工厂模式可以解决这个问题。创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
    创建一个工厂的接口:
    
    创建实现Persion接口的2个类:
        同上。。。。。。
    创建2个工厂类:
    
  测试:
    

  结果:

    

3,单例模式(Singleton)
  单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处:
    1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。
    2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。
    3、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。(比如一个军队出现了多个司令员同时指挥,肯定会乱成一团),所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程。
  单例模式在多线程会有一个同步问题,不在这里讨论

4,建造者模式(Builder)

  建造者模式是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性。看代码:
  模拟台式电脑组装:
    电脑实体类:
      

    抽象建造者:
      
    继承AbsPCBuilder具体建造者:
      
    具体使用者,负责电脑的组装:
      

    测试:
      
    结果:
      

与工厂模式的区别:工厂模式关注的是创建单个产品,而建造者模式则关注创建复合对象,多个部分。
  使用建造者模式的好处:
    1,使用建造者模式可以使客户端不必知道产品内部组成的细节。
    2,具体的建造者类之间是相互独立的,对系统的扩展非常有利。
    3,由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。

  使用建造者模式的场合:
    1,创建一些复杂的对象时,这些对象的内部组成构件间的建造顺序是稳定的,但是对象的内部组成构件面临着复杂的变化。
    2,要创建的复杂对象的算法,独立于该对象的组成部分,也独立于组成部分的装配方法时。

4,原型模式(Prototype)
  将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。
  一个原型类,只需要实现Cloneable接口,覆写clone方法,此处clone方法可以改成任意的名称,因为Cloneable接口是个空接口。
  创建一个原型类:
    

  浅复制和深复制: 
    浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。 
    深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。
    上面的复制就是浅复制,下面来看一个深复制的例子:
      

    要实现深复制,需要采用流的形式读入当前对象的二进制输入,再写出二进制数据对应的对象。

参考质料:http://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html

posted @ 2016-06-23 09:06  My_灏灏  阅读(200)  评论(0编辑  收藏  举报