设计模式(单例)
第七天
设计模式
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的代码设计的经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
总体来说设计模式分为三大类:
创建型模式(5种):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式(7种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式(11种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
1.什么是单例模式
单例模式是创建型模式,它的目的是一个类只有一个实例,并提供一个全局访问点。
使用场景是,频繁创建和销毁对象会使成本较高,使用单例模式可以提高效率。例如日志记录器,数据库连接池。
主要有5种。分别是懒汉、饿汉、静态内部类、双重校验锁以及枚举。
实现思路是那把构造函数private,提供一个全局访问方法,初始化单例对象,并且要保证只能初始化一个单例对象。并且需要考虑线程安全的问题。
饿汉模式
饿汉模式思想是在类刚一初始化的时候就立即把单例对象创建出来,实现方法是,私有构造器,保证其他其他地方不能new对象,利用static代码块只运行一次的特点,来实现只初始化一个单例对象,利用静态方法提供全局访问点。
public class Boss {// 1、设计一个私有的、静态的、当前类的对象private static Boss instance;static {// 对instance静态对象进行实例化instance = new Boss();}// 2、将单例类的构造方法私有化,杜绝从外界通过new的方式实例化对象的可能性。private Boss() {System.out.println("一个Boss对象出现了 "); } // 3、需要提供一个public权限的静态方法,可以获取一个当前类的对象。public static Boss getCurrentBoss() {return instance;} }
懒汉模式
懒汉模式,就是在需要的时候才会去创建对象。现方法是,私有构造器,保证其他其他地方不能new对象,利用static提供全局访问点,并在方法判断是否已经创建过对象,如果创建过就返回已有的来保证只有一个单例对象。
public class Master { private static Master instance;private Master() {System.out.println("一个Chairman对象被实例化了 "); }public static Master getMaster() {// 使用到instance对象的时候,判断是不是nullif (instance == null) {// 实例化instance = new Master();}return instance;} }
静态内部
public class Singleton { private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton (){} public static final Singleton getInstance() { return SingletonHolder.INSTANCE; } }
枚举
public enum Singleton { INSTANCE; public void whateverMethod() { } }
双重校验锁
public class Singleton { private volatile static Singleton singleton; private Singleton (){} public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }
如何破会单例模式?
想要破坏单例,只要想办法能够执行到这个私有的构造方法就行了。例如反射,反序列化。
如何防止破坏单例模式?
在构造方法上做判断,创建的对象是否为空,使其在反射调用的时候识别出来对象是不是被创建过。
private Singleton() { if (singleton != null){ throw new RuntimeException("单例对象只能创建一次... "); }
扩展
工厂模式
主要功能是帮助我们实例化对象,对象实例化过程是通过工厂实现的,工厂代替new操作。有三种:
简单工厂模式:一个工厂创建多种具体产品
工厂方法模式:一个工厂方法只创建一个具体产品
抽象工厂模式:一个工厂方法只创建一类具体产品
单例模式
确保一个类只有一个实例,并提供一个全局访问点,这种模式可以保证对象的唯一性,并方便对象的管理控制和复用。
实现方式:饿汉式、懒汉式、静态内部类、枚举、双重校验锁
问题:序列化和反射可能破坏单例模式
解决方法:定义readResolve()方法,或在构造方法中判断
模板方法模式
是一种行为设计模式,主要作用是复用代码
将公共部分定义在一个父类中,将定制部分实现在子类中
这样子类可以根据需要扩展或重写父类的方法,而不需要改变算法结构
策略模式
是一种行为设计模式,它允许在运行时根据不同情况选择算法的不同实现。它将算法和相应的行为封装在一个独立的类中,使它们可以相互替换,而不会影响客户的使用。与if-else相比:
更易扩展
更易读
提高代码复用性
适配器模式
将类的接口转换成客户端希望的另一个接口,可以使得原本不兼容的类可以协同工作。