尚学堂视频
创建型模式:
——单例,工厂,抽象工厂,建造者,原型
结构型模式:
——适配器、桥接、装饰、组合、外观、享元、代理
行为型模式:
——模版、命令、迭代器、观察者、中介、备忘录、解释器、状态、策略、责任链、访问者
单例:保证只有一个实例,提供一个全局访问该实例的全局访问点。
懒汉式:静态私有属性,静态公共方法获取,私有构造函数;
饿汉式:静态私有属性的赋值放在了获取方法里,要进行同步关键字:synchronizied修饰
双重检测锁实现,由于编译器优化原因和jvm底层模型原因,偶尔会出现问题。不建议使用。
静态内部类实现方式,线程安全,调用效率高,延迟加载等优点(利用类加载器的机制)
public class SingletonDemo {
private static class SingletonClassInstance {
private static SingletonDemo instance = new SingletonDemo();
}
private SingletonDemo() {
}
private static SingletonDemo getInstance() {
return SingletonClassInstance.instance;
}
}
枚举实现单例模式(可避免反射、反序列化等问题,无懒加载)
public enum SingletonDemo {
instance;
public void method() {
System.out.println("xxxxx");
}
}
使用myeclipse的uml插件画出类图,或rational rose、metamill等
常见的5种单例模式在多线程环境下的效率测试
饿汉式 22ms
懒汉式 636ms
静态内部类 28ms
枚举式 32ms
双重检查锁式 65ms
以上为相对值,在不同环境下不同的程序测试结果是不一样的
CountDownLatch
-同步辅助类,在完成一组正在其他线程中执行的操作之前,它运行一个或多个线程一直等等
countDown()当前线程调用此方法,则计数减一(建议放在finally里执行)
await(),调用次方法会一直阻塞当前线程,直到计时器的值为0
工厂:
简单工厂的重点是在选择,而非创建对象
建造者:如建造一个复杂的产品,有许多步骤需要处理。
建造模式的本质:
——分离了对象子组件的单独构造(由Builder来负责)和装配(由Director负责)。从而可以构建出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况下使用。
——由于实现了构建和装配的解耦。不同的构建器,相同的装配,也科技做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。也就实现了构建算法、装配算法的解耦,实现了更好的复用。
http://www.runoob.com/design-pattern/builder-pattern.html
使用场景:1、需要生成的对象具有复杂的内部结构。2、需要生成的对象内部属性本身相互依赖。
注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
原型模式:prototype
克隆:提高创建对象的效率,实现 cloneable接口,默认只是浅克隆(即类的普通属性,基本数据类型会被复制,引用类型不会被复制;克隆不走构造方法)
利用序列化和反序列化实现深克隆:序列化接口Serializable
Test t1 = new Test();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(t1);
byte[] bytes = bos.toByteArray();
ByteArrayInputStream bis =new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bis);
Test t2 = (Test)ois.readObject();//t2就是克隆后的对象
原型模式很少单独出现,一般是和工厂方法模式一起出现,spring中bean的创建实际就是两种:单例模式和原型模式。
实际使用中,单例模式,简单工厂模式使用多(工厂模式,会增加过多类不便于管理,抽象工厂模式增加产品族,对新增加产品无力)
原型模式