学习设计模式笔记_创建型模式

148 阅读4分钟

单例模式

1. 饿汉式

public class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton(){}

    public static Singleton getInstance(){
    return instance;
    }
}

结构 : 构造器私有化 在类的内部创建对象 向外暴露一个静态的公共方法获取实例

public class Singleton{
    public static final Singleton INSTANCE;
    private String info;
    static {

    try {
        Properties pro = new Properties();
        pro.load(Singleton.class.getClassLoader().getResourceAsStream("Single.properties"));
        INSTANCE = new Singleton3(pro.getProperty("info"));
    } catch (IOException e) {
        throw new RuntimeException(e);
    }

}
    private Singleton(String info){
     this.info = info;
}
}

结构 : 在类内部创建静态代码块 在代码块中创建对象

优缺点 : 写法比较简单 在类装载的时候就完成实例化 避免线程了同步问题 , 但是在类装载时就完成了实例化 , 如果没有使用就会造成浪费 而且导致类装载的原因有很多 , 不能保证只有通过制定的方法才导致类的装载

2. 懒汉式

public class Singleton {
    private static Singleton instance = null;

    private Singleton() {
    }

    public static Singleton getInstance() {
        if (null == instance) {
         instance = new Singleton();
        }
        return instance;
    }
}

结构 : 创建一个静态方法和静态成员变量方法内对象为null创建返回 不为null直接返回 (不推荐)

优缺点 : 实现了懒加载的效果 但是多线程的情况下同时进入判断就会创建多个 破坏了单例的初衷

public class Singleton {
    private static Singleton instance = null;

    private Singleton() {
    }

    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

结构 : 在获取实例的方法上加锁 解决线程安全问题 (不推荐)

优缺点 : 解决了线程安全的问题 但是效率降低 每次执行方法时都需要经过锁同步

public class Singleton {
    private static Singleton instance = null;

    private Singleton() {
    }

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

结构 : 双重检查加锁 (推荐)

优点 : 解决了线程安全问题 当对象被实例化之后就不会进行锁的判断保证了效率下实现单例

3. 静态内部类

public class Singleton {
    private static volatile Singleton instance;

    private Singleton() {
    }

    private static class SingletonInstance {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonInstance.INSTANCE;
    }
}

结构 : 写一个静态内部类 , 该类中有一个静态属性对象 提供一个静态的共有方法 返回对象 (推荐)

优点 : 实例化类时内部类不会立即执行 调用方法时回去实例化内部类 类在加载时是线程安全的

4. 枚举

public enum Singleton {

    INSTANCE;

    public void doSomething() {
        System.out.println("我是枚举单例");
    }

}

public class Client {
    public static void main(String[] args) {
        Singleton.INSTANCE.doSomething();
    }

}

结构 : 将需要实现单例的对象定义为枚举类 (推荐)

优点 : 利用枚举的特性,让JVM来帮我们保证线程安全和单一实例的问题 ,写法还特别简单

简单工厂

结构 : 定义了一个创建对象的工厂 , 由工厂对象决定创建出哪一个产品类的实例 , 工厂封装对象创建过程 , 当我们会用到大量的某类或者某批对象时 , 就会使用到工厂模式

抽象工厂

结构 : 将产品对象与工厂对象都进行抽象

工厂类模式特点 : 不直接依赖,实现了解耦,将变化装移到工厂,如果需要修改实现或者创建方式只需要修改工厂类代码

工厂模式总结 : 创建一个工厂对象 , 提供获取实例的方法 , 根据使用者不同的参数返回对应的实例 . 这样更换实例或者新增实例时 只需要修改工厂代码 实现了同一管理和维护 应用间的解耦 , 工厂方法 抽象工厂 遵循了设计模式的依赖抽象的原则 提高了代码稳定性 更易扩展

原型模式

定义 : 用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象,通过拷贝复制出一个新的对象.最简单的设计模式

实现 Cloneable 接口 重写clone() 方法 实现浅copy 通过序列化的方式 实现深copy

创建对象比较复杂时 , 可以利用原型模式简易的创建对象 , 提高效率 不用重新初始化对象 , 而是动态的获得对象运行时的状态

建造者模式

角色 :

Director 指挥者 : 聚合AbstractBuilder , 主要用于创建一个复杂的对象 , 它主要有两个作用 隔离客户与对象的生产过程 , 负责控制产品对象的生产过程

AbstractBuilder 抽象建造者 : 创建一个Product对象的各个部件指定的接口

Builder 具体建造者 : 实现AbstractBuilder , 实现构建Product方法

AbstractProduct 抽象产品 : 与建造者之间依赖

Product 产品 : 一个具体的产品对象

总结 :

创建一个对象需要多条操作时 , 使用建造者模式 ; 抽象建造者 定义需要执行的操作 具体建造者负责实现 指挥者安排执行 消费者只需要创建对应的具体建造者 就可以通过指挥者获取到产品 ; 将一个复杂的创建过程从消费者中抽离 创建方式改变时只需修改指挥者 产品改变时只需改变 具体建造者 实现了产品,创建过程,消费者的解耦达到了灵活运用

学习设计模式笔记_设计原则