1、单例模式
饿汉模式(最简单):类加载的时候就创建对象,线程安全
public class Singleton {
// 首先,将构造方法 私有化
private Singleton() {};
// 创建私有静态实例,意味着在类加载就会进行创建
private static Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
}
饱汉模式:(双重效验锁)
public class Singleton {
private Singleton() {}
// 和饿汉模式相比,这边不需要先实例化出来,注意这里的 volatile,它是必须的
private static volatile Singleton instance = null;
public static Singleton getInstance() {
if (instance == null) {
// 加锁
synchronized (Singleton.class) {
// 这一次判断也是必须的,不然会有并发问题
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
双重检查,指的是两次检查 instance 是否为 null。
2、工厂模式
1、简单工厂模式
实例化对象不是用new,用工厂方法替代。一个工厂类 XxxFactory,里面有一个静态方法,根据我们不同的参数,返回不同的派生自同一个父类(或实现同一接口)的实例对象。
1 public class FoodFactory { 2 3 public static Food makeFood(String name) { 4 if (name.equals("noodle")) { 5 Food noodle = new LanZhouNoodle(); 6 noodle.addSpicy("more"); 7 return noodle; 8 } else if (name.equals("chicken")) { 9 Food chicken = new HuangMenChicken(); 10 chicken.addCondiment("potato"); 11 return chicken; 12 } else { 13 return null; 14 } 15 } 16 }
2、工厂模式
之所以需要引入工厂模式,是因为我们往往需要使用两个或两个以上的工厂。
3、抽象工厂模式
为了解决不同的工厂生产产品的兼容问题,提出抽象工厂。直接选择一家品牌工厂,品牌工厂会负责生产所有的东西,而且能保证肯定是兼容可用的。
3、原型模式
有一个原型实例,基于这个原型实例产生新的实例,也就是“克隆”了。
Object 类中有一个 clone() 方法,它用于生成一个新的对象,当然,如果我们要调用这个方法,java 要求我们的类必须先实现 Cloneable 接口,此接口没有定义任何方法,但是不这么做的话,在 clone() 的时候,会抛出 CloneNotSupportedException 异常。
protected native Object clone() throws CloneNotSupportedException;
Java 的克隆是浅克隆,碰到对象引用的时候,克隆出来的对象和原对象中的引用将指向同一个对象。通常实现深克隆的方法是将对象进行序列化,然后再进行反序列化。