设计模式
2019-03-06 19:42:56 66 举报
AI智能生成
ddd
作者其他创作
大纲/内容
设计模式
创建型模式
简单工厂模式
主要成分
1、抽象产品 2、具体产品3、具体工厂
缺点:在进行扩展的时候,我们要更改工厂函数里面的那个分支语句Switch,这样便破坏了封装性
工厂方法模式
抽象产品类具体产品类抽象工厂类具体工厂类
抽象工厂模式
与【工厂方法模式】区别:工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类。
单例模式
饿汉式
优点:这种写法比较简单,就是在类装载的时候就完成实例化。避免了线程同步问题。
缺点:在类装载的时候就完成实例化,没有达到Lazy Loading的效果
懒汉式
优点:起到了Lazy Loading的效果
缺点:但是只能在单线程下使用
双重检查
优点:线程安全;延迟加载;效率较高
缺点:序列化、反射
静态内部类
利用了ClassLoader来保证了同步,同时又能让开发者控制类加载的时机。从内部看是一个饿汉式的单例(提前分配内存),但是从外部看来,又的确是懒汉式的实现(调用的时候才实例化)。
// Effective Java 第一版推荐写法public class Singleton { private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton (){} public static final Singleton getInstance() { return SingletonHolder.INSTANCE; }}
枚举
【问题1】序列化,枚举保障了每次序列化的对象不是重新new出来的,否者普通单例必须使用readResolve保证序列化后是同一个对象
【问题2】反射问题,反射获取实例的时候判断类型是否为Enum类型,若是直接抛异常
public final class EnumSingleton extends Enum< EnumSingleton> { public static final EnumSingleton ENUMSINGLETON; public static EnumSingleton[] values(); public static EnumSingleton valueOf(String s); static {};}
以上反编译内容,完全是一个不可变类,有输入值的位置,但是没有修改的方式,并且final不可修改
缺点:无法继承
建造者模式
场景
建造者模式的使用场合是当创建复杂对象时,把创建对象成员和装配方法分离出来,放在建造者类中去实现,用户使用该复杂对象时,不用理会它的创建和装配过程,只关心它的表示形式。
原型模式
优点:
1、如果创建新的对象比较复杂时,可以利用原型模式简化对象的创建过程,同时也能够提高效率。 2、可以使用深克隆保持对象的状态。 3、原型模式提供了简化的创建结构。
缺点:在实现深克隆的时候可能需要比较复杂的代码。
应用场景:
1、如果创建新对象成本较大,我们可以利用已有的对象进行复制来获得。 2、如果系统要保存对象的状态,而对象的状态变化很小,或者对象本身占内存不大的时候,也可以使用原型模式配合备忘录模式来应用。
结构型模式
适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式
代理模式:
静态代理
实现:
public class BuyHouseProxy implements BuyHouse { private BuyHouse buyHouse; public BuyHouseProxy(final BuyHouse buyHouse) { this.buyHouse = buyHouse; } @Override public void buyHosue() { System.out.println(\"买房前准备\"); buyHouse.buyHosue(); System.out.println(\"买房后装修\"); }}
使用:
BuyHouse buyHouse = new BuyHouseImpl(); buyHouse.buyHosue(); BuyHouseProxy buyHouseProxy = new BuyHouseProxy(buyHouse); buyHouseProxy.buyHosue();
动态代理
DynamicProxyHandler implements InvocationHandler
3.通过代理实例化
缺点:只能是接口
cglib
CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。可用于接口以及类
行为型模式
责任链
servlet中的filterdubbo中的filtermybatis中的plugin 这3个框架在实现责任链方式不尽相同。
0 条评论
回复 删除
下一页