java基础----常用设计模式

版权声明:本文为博主原创文章,转载请注明原帖地址,谢谢 https://blog.csdn.net/AooMiao/article/details/68941014

单例设计模式

  • 饿汉式:线程安全,因为事先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的变量赋给外部类的成员变量
  • 保证了实例化复杂对象的一致性和灵活性,也适合用在使用方法顺序不同会产生不同结果的场合
    简单例子:

猜你喜欢

转载自blog.csdn.net/AooMiao/article/details/68941014