工厂模式:
简单工厂模式(静态工厂):
1.定义一个类的基类
2.同类的产品实现这个基类
3.定义工厂类,其中通过switch-case方式,客户选择哪种产品就哪种
缺点:工厂类中定义好了产品,如果需要新增产品就需要修改工厂类
扩展性差(我想增加一种面条,除了新增一个面条产品类,还需要修改工厂类方法)
2 不同的产品需要不同额外参数的时候 不支持。

 抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。

工厂方法模式
提供一个产品类的接口。产品类均要实现这个接口(也可以是abstract类,即抽象产品)。
提供一个工厂类的接口。工厂类均要实现这个接口(即抽象工厂)。
由工厂实现类创建产品类的实例。工厂实现类应有一个方法,用来实例化产品类。
1.定义一个抽象工厂,工厂实现类(包括生产方法)
2.定义产品抽象类,产品实现类
3.消费者类

抽象工厂模式:

抽象工厂模式的优点
        抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束。所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理。

工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。

https://www.cnblogs.com/zailushang1996/p/8601808.html

单例模式:
1.饿汉模式
将构造方法设为私有的,并设置成员变量并初始化对象(立即加载)。通过静态方法返回初始化对象。
2.懒汉模式
将构造方法设为私有的,设置成员变量并不初始化(延迟加载),通过静态方法返回new出的对象,首先,判断成员变量是否为空,然后,为new出对象的代码块加上锁,最后在判断一次成员变量是否为空,最后new出对象。
3.静态内部类实现
静态内部类虽然保证了单例在多线程并发下的线程安全性,但是在遇到序列化对象时,默认的方式运行得到的结果就是多例的
4.static静态代码块实现
5.内部枚举类实现

静态代理和动态代理本质区别:你是否需要修改源代码(不包含测试类),就可以控制代理内容的变化。
静态代理:程序写好之后,你想修改代理过程,就必须修改源代码。
动态代理:程序写好后,你更改代理过程。只需要修改代理对象(分身)

静态代理总结:
优点:可以做到在符合开闭原则的情况下对目标对象进行功能扩展。
缺点:我们得为每一个服务都得创建代理类,工作量太大,不易管理。同时接口一旦发生改变,代理类也得相应修改。 

JDK动态代理:
  代理类实现invocationHandler
 优点:相对于静态代理,动态代理大大减少了我们的开发任务,同时减少了对业务接口的依赖,降低了耦合度。
缺点:需要被代理类实现接口。

CGLIB动态代理:
CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。
但因为采用的是继承,所以不能对final修饰的类进行代理。

优点:CGLIB创建的动态代理对象比JDK创建的动态代理对象的性能更高,对于单例的对象,因为无需频繁创建对象,用CGLIB合适。

缺点:CGLIB创建代理对象时所花费的时间却比JDK多得多。

 

个人分类: 设计模式
Spring框架中使用到了大量的设计模式,下面列举了比较有代表性的:
代理模式—在AOP和remoting中被用的比较多。
单例模式—在spring配置文件中定义的bean默认为单例模式。
模板方法—用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
工厂模式—BeanFactory用来创建对象的实例。
适配器--spring aop
装饰器--spring data  hashmapper
观察者-- spring 时间驱动模型

10-06 14:54