创建型模式分为五类:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式
一、工厂方法模式:接口-实现类、工厂类
工厂类的目的是为了产生Sender对象,通过不同的参数传入产生不同的对象。
将工厂类中的工厂方法改为多个工厂方法即为多个工厂方法的设计模式
将工厂类中的工场方法改为static即为静态工厂方法设计模式
二、抽象工厂方法模式:接口-实现类、接口-工厂类
特点是:
工厂类实现某个接口,利于以后扩展,比如可以增加BlueTooth的工厂类。
工厂设计模式是抽象工厂设计模式的一个特例。
三、单例模式
单例对象(Singleton),保证在一个JVM中,该对象只有一个实例存在。
饿汉模式:类加载的时候就会创建,加载类时比较慢,但运行时获取对象的速度比较快,线程安全
/* * 类型:饿汉模式 */ public class Singleton { //1.将构造方法私有化,不允许外部直接创建对象 private Singleton(){ } //2.创建类的唯一实例,使用private static修饰 private static Singleton instance=new Singleton(); //3.提供一个用于获取实例的方法,使用public static修饰 public static Singleton getInstance(){ return instance; } }
懒汉模式:类加载的时候不去创建,加载类时比较快,第一个用户获取时再去创建实例,第一次获取对象的速度比较慢,线程不安全
/* * 懒汉模式 */ public class Singleton2 { //1.将构造方式私有化,不允许外边直接创建对象 private Singleton2(){ } //2.声明类的唯一实例,使用private static修饰 private static Singleton2 instance; //3.提供一个用于获取实例的方法,使用public static修饰 public static Singleton2 getInstance(){ if(instance==null){ instance=new Singleton2(); } return instance; } }
四、建造者模式
参考:
http://www.cnblogs.com/BeyondAnyTime/archive/2012/07/19/2599980.html
http://www.cnblogs.com/devinzhang/archive/2012/01/06/2314670.html
1. builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。
2. ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例。
3. Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。
4. Product:要创建的复杂对象。
public interface Product { } public interface Part { } //Builder接口 public interface Builder { void buildPartA(); void buildPartB(); void buildPartC(); Product getResult(); } //具体建造类,不同的类对于不同的Part有不同的实现方法 public class ConcreteBuilder implements Builder { Part partA, partB, partC; public void buildPartA() { //这里是具体如何构建partA的代码 }; public void buildPartB() { //这里是具体如何构建partB的代码 }; public void buildPartC() { //这里是具体如何构建partB的代码 }; public Product getResult() { //返回最后组装成品结果 }; } //建造者,产生最终的Product public class Director { private Builder builder; public Director( Builder builder ) { this.builder = builder; } public void construct() { builder.buildPartA(); builder.buildPartB(); builder.buildPartC(); } } //测试代码: ConcreteBuilder builder = new ConcreteBuilder(); Director director = new Director( builder ); director.construct(); Product product = builder.getResult();
五、原型模式
参考:http://blog.csdn.net/zhengzhb/article/details/7393528
原型模式的优点及适用场景
使用原型模式创建对象比直接new一个对象在性能上要好的多,因为Object类的clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。
使用原型模式的另一个好处是简化对象的创建,使得创建对象就像我们在编辑文档时的复制粘贴一样简单。
因为以上优点,所以在需要重复地创建相似对象时可以考虑使用原型模式。比如需要在一个循环体内创建对象,假如对象创建过程比较复杂或者循环次数很多的话,使用原型模式不但可以简化创建过程,而且可以使系统的整体性能提高很多。
原型模式的注意事项
使用原型模式复制对象不会调用类的构造方法。因为对象的复制是通过调用Object类的clone方法来完成的,它直接在内存中复制数据,因此不会调用到类的构造方法。不但构造方法中的代码不会执行,甚至连访问权限都对原型模式无效。还记得单例模式吗?单例模式中,只要将构造方法的访问权限设置为private型,就可以实现单例。但是clone方法直接无视构造方法的权限,所以,单例模式与原型模式是冲突的,在使用时要特别注意。
深拷贝与浅拷贝。Object类的clone方法只会拷贝对象中的基本的数据类型,对于数组、容器对象、引用对象等都不会拷贝,这就是浅拷贝。如果要实现深拷贝,必须将原型模式中的数组、容器对象、引用对象等另行拷贝。
PS:深拷贝与浅拷贝问题中,会发生深拷贝的有java中的8中基本类型以及他们的封装类型,另外还有String类型(String是final的无法修改,修改即创建新对象),其余的都是浅拷贝。