单例设计模式
- 饿汉式:线程安全,因为事先new Single()实例化对象了,不会有访问冲突发生,但是效率低
public class Single {
private static Single single = new Single();//实例私有化,只能通过下面方法获得
private Single(){//构造私有化
}
public static Single getInstance(){
return single;
}
}
- 懒汉式:效率高,但是线程不安全,假设两个异步线程同时进入getInstance方法,都会创建新的Single对象
public class Single {
private static Single single = null;
private Single(){
}
public static Single getInstance(){
if(single==null){
single = new Single();
}
return single;
}
}
- 懒汉式(即安全也效率高)
public class Single {
private static Single single = null;
private Single() {
}
public static Single getInstance() {
if (single == null) {
synchronized (Single.class) {//同步块,防止访问冲突
if (single == null) {
single = new Single();
}
}
}
return single;
}
}
PS:解释下为什么同步块里还要判断single 是否为空,假设两个线程AB都在执行到同步块那里去,然后A进去了,B在外面等着,如果没有判空的话,A创建了Single实例,出来后,B可以进去了,B又创建了Single实例,造成对象Single过多,所以要判空
工厂设计模式
简单工厂:由三部分组成
- 具体工厂类:以具体工厂类为核心,定义返回抽象产品的方法,接受参数进行逻辑判定,判定用户想要哪个产品
public class CarFactory {
public static Car getCar(String Tag){
switch (Tag){
case "BMW":
return new BMW();
case "AuDi":
return new AuDi();
}
return null;
}
}
- 抽象产品类:产品的基类,降低耦合
public abstract class Car {
//具体逻辑方法
}
- 具体产品类:继承抽象产品,重写属于自己的方法
public class BMW extends Car {
//具体逻辑方法
}
public class AuDi extends Car {
//具体逻辑方法
}
工厂方法:简单工厂的进一步改善,四部分组成
- 抽象工厂:以抽象工厂为核心,定义返回抽象产品的方法
public abstract class CarFactory {
public abstract Car getCar();
}
- 具体工厂:继承抽象工厂,重写方法,返回具体的产品实例
public class BmwFactory extends CarFactory {
@Override
public Car getCar() {
return new BMW();
}
}
public class AuDiFactory extends CarFactory {
@Override
public Car getCar() {
return new AuDi();
}
}
- 抽象产品:产品的基类,降低耦合
public abstract class Car {
//具体逻辑方法
}
- 具体产品:继承抽象产品,重写属于自己的方法
public class BMW extends Car {
//具体逻辑方法
}
public class AuDi extends Car {
//具体逻辑方法
}
Build模式
- 创建静态内部类Builder,成员变量和外部类一样,Builder有一系列对变量赋值,最后有个Build(Builder build)方法,把build的变量赋给外部类的成员变量
- 保证了实例化复杂对象的一致性和灵活性,也适合用在使用方法顺序不同会产生不同结果的场合
简单例子: