设计模式
2019-03-06 19:42:56 66 举报
AI智能生成
ddd
作者其他创作
大纲/内容
创建型模式
简单工厂模式
主要成分
1、抽象产品
2、具体产品
3、具体工厂
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;
}
}
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 {};
}
public static final EnumSingleton ENUMSINGLETON;
public static EnumSingleton[] values();
public static EnumSingleton valueOf(String s);
static {};
}
以上反编译内容,完全是一个不可变类,有输入值的位置,但是没有修改的方式,并且final不可修改
缺点:无法继承
建造者模式
场景
建造者模式的使用场合是当创建复杂对象时,把创建对象成员和装配方法分离出来,放在建造者类中去实现,用户使用该复杂对象时,不用理会它的创建和装配过程,只关心它的表示形式。
原型模式
优点:
1、如果创建新的对象比较复杂时,可以利用原型模式简化对象的创建过程,同时也能够提高效率。
2、可以使用深克隆保持对象的状态。
3、原型模式提供了简化的创建结构。
2、可以使用深克隆保持对象的状态。
3、原型模式提供了简化的创建结构。
缺点:在实现深克隆的时候可能需要比较复杂的代码。
应用场景:
1、如果创建新对象成本较大,我们可以利用已有的对象进行复制来获得。
2、如果系统要保存对象的状态,而对象的状态变化很小,或者对象本身占内存不大的时候,也可以使用原型模式配合备忘录模式来应用。
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("买房后装修");
}
}
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();
buyHouse.buyHosue();
BuyHouseProxy buyHouseProxy = new BuyHouseProxy(buyHouse);
buyHouseProxy.buyHosue();
动态代理
1,实现
DynamicProxyHandler implements InvocationHandler
2,覆盖方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("买房前准备");
Object result = method.invoke(object, args);
System.out.println("买房后装修");
return result;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("买房前准备");
Object result = method.invoke(object, args);
System.out.println("买房后装修");
return result;
}
3.通过代理实例化
BuyHouse buyHouse = new BuyHouseImpl();
BuyHouse proxyBuyHouse = (BuyHouse) Proxy.newProxyInstance(BuyHouse.class.getClassLoader(), new
Class[]{BuyHouse.class}, new DynamicProxyHandler(buyHouse));
proxyBuyHouse.buyHosue();
BuyHouse proxyBuyHouse = (BuyHouse) Proxy.newProxyInstance(BuyHouse.class.getClassLoader(), new
Class[]{BuyHouse.class}, new DynamicProxyHandler(buyHouse));
proxyBuyHouse.buyHosue();
ClassLoader loader:指定当前目标对象使用的类加载器,获取加载器的方法是固定的
Class<?>[] interfaces:指定目标对象实现的接口的类型,使用泛型方式确认类型
InvocationHandler:指定动态处理器,执行目标对象的方法时,会触发事件处理器的方法
Class<?>[] interfaces:指定目标对象实现的接口的类型,使用泛型方式确认类型
InvocationHandler:指定动态处理器,执行目标对象的方法时,会触发事件处理器的方法
缺点:只能是接口
cglib
CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。可用于接口以及类
行为型模式
责任链
servlet中的filter
dubbo中的filter
mybatis中的plugin 这3个框架在实现责任链方式不尽相同。
dubbo中的filter
mybatis中的plugin 这3个框架在实现责任链方式不尽相同。
0 条评论
下一页