工厂模式:
简单工厂模式:
由类结构上看,简单工厂模式和状态模式是没什么区别。那么之所以还会单独抽取出一种模式,还是那句话。这主要体现在了业务语义上即用工厂生产对象而不是直接的new出来。
工厂方法模式:
不过不太明白为什么叫这个名字,不过别人都叫,那么就这么叫吧。不过从类结构上来命名的话应该叫做抽象工厂生产抽象产品的模式。即此模式的类结构包括一个抽象工厂类及若干个具体的工厂实现类,还包括一个抽象产品类及多个具体产品的实现类,最终用抽象工厂生产抽象产品。这相对于简单工厂来说是进一步抽象了工厂,即增加的工厂的生产分工。也就是随着社会化大生产的进行,社会生产越来越详细。
抽象工厂模式:
随着社会化大生产的进一步发展,一个工厂已经不能再单独的生产一个商品。而是一个工厂生产产品的一个具体的零部件。本人觉得此工厂造成结构有些复杂而且比较少用,所以就不赘余了。
单例模式
饿汉模式:
public class Singleton {
private Singleton instance = null;
static {
instance = new Singleton();
}
private Singleton (){}
public static Singleton getInstance() {
return this.instance;
}
}
懒汉模式1(线程不安全,不能用):
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
懒汉模式2(线程安全,效率低下,不知道谁研究出来的)
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
懒汉模式3(还是错误,效率也低,不知道谁研究出来的)
public class Singleton {
private static Singleton singleton;
private Singleton (){}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
这里值得注意的是,此双重检查的模式还是没有打到线程安全的目的。当然这是因为java程序语言执行过程中指令重排序造成的。这里的指令重排序包含编译阶段的冲排序,cup阶段的重排序,内存系统的重排序。而 singleton = new Singleton(); 这句代码并不是原子的,具体表现为这句代码分为两个步骤singleton 对象开辟内存空间和singleton 对象初始化,如果对着两步重排序必定造成一些问题,当然现在引入volatile 关键字会解决这一问题。具体也不说了,再说就扯远了。因为我感觉单例模式的懒加载的模式在绝大多数的情况下毫无意义。
原型模式
原型模式也是属于一种创建对象的方法,特殊的是它是自己创建自己的方法,也就是克隆自己。在代码结构的角度来说也就是调用对象自己的某个方法,new出自己并给new出的对象的属性进行赋值(反射的方法给自己进行对象的克隆)。这典型体现在jdk当中的Clone接口。