1.工厂方法模式(Factory Method Pattern):
定义一个创建对象的接口,让实现这个接口的类来决定实例化哪个类;工厂方法让类的实例化推迟到子类中进行;
a.简单工厂模式(Simple Factory Pattern): 由一个工厂对象决定决定创造出哪一种产品类的实例;
属于创建型模式,但是不属于GOF 23中设计者模式;
适用场景:工厂类负责创建的对象较少;客户端只需要传入工厂类的参数,无需知道创建对象的逻辑;LoggerFactory,Calendar
缺点:不易于扩展负责的产品结构;
b.抽象工厂模式:提供创建一系列相关或者相互依赖对象的接口,无须指定他们具体的类;
属于创建型设计模式;
缺点: 类的个数容易过多,增加了代码结构的复杂度;增加了代码的抽象性和理解难度;
适用场景:应用层不依赖于产品类实例如何被创建,实现等细节;
强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码;
提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现;
应用实例:数据库连接;
产品族: 一系列的相关的产品,整合到一起有关联性;
产品等级:同一个继承体系;
2.单例模式(Singleton Pattern):
确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点;
隐藏所有的构造方法;
属于创建型模式;
应用实例:ServletContext,ServletConfig,ApplicationConfig,DBPool;
a.饿汉式单例:
优点:效率高,性能高;
缺点:使用大量的单例,初始化的时候可能造成内存浪费;
b.懒汉式单例;(双重判断,if里面synchronized,然后里面if创建实例;可能造成指令重排序,成员变量需要volatitle修饰);
c.注册式单例;(Map容器式)
d.ThreadLocal单例;(在同一个线程里面是单例的,应用实例Mybatis里面错误日志输出ErrorContext,保证每个线程异常隔离);
单例总结:
a.私有化构造器;
b.保证线程安全;
c.延迟加载;(饿汉式)
d.防止系列化和反序列化破坏单例;(readResolve(){return INSTANCE;})
e.防止反射攻击单例;(构造器里面抛异常,阻止使用构造器);
3.原型模式(Prototype Pattern):原型实例制定创建对象的种类,并且通过copy这些实例创建新的对象;
调用者不需要知道任何细节,不调用构造函数;
属于创建型模式;
和单例模式冲突;
Cloneable都是浅克隆;
深克隆:a.序列化; b.转Json;
Java自带的原型模式是基于二进制流的拷贝,比直接new一个对象性能提升很多;
缺点:必须配备克隆或者copy方法;
4.建造者模式(Builder Pattern):
将一个复杂对象的构和它的表示分离,使得同样的构建过程可以创建不同的表示;
用户只需要指定需要创造的类就可以获得,建造过程和细节不需要了解;
属于创建型模型;
Spring中用到的设计者模式:
工程模式: BeanFactory;
装饰者模式: BeanWrapper;
代理模式: AopProxy;
单例模式: ApplicationContext;
委派模式: DispatcherServlet;
策略模式: HandlerMapping;
适配者模式: HandlerAdapter;
模板方法模式: JdbcTemplate;
观察者模式: ContextLoaderListener;