设计者模式

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;

 

posted @ 2020-12-23 11:27  希乐曼  阅读(156)  评论(0编辑  收藏  举报