java设计模式笔记

来源:互联网 发布:阿里云国际版怎么支付 编辑:程序博客网 时间:2024/06/05 02:03

一.原型模式

1. 定义:Specify the kinds of objects to create using a prototypical instance, and create new objects by copying this prototype.


2. 简单点说,就是复制对象,实现Cloneable接口,并重写Object类里面的clone方法:

public Thing clone(){private final ArrayList<String> arrayList = new ArrayList<String>();Thing thing=null;try {thing = (Thing)super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return thing;}

3. 特点:在复制对象的过程中,构造函数是不会走的,性能比直接new一个对象要好很多。
分深拷贝,浅拷贝,
上面的例子是浅拷贝,即复制得到的对象与原对象引用的arrayList是同一个。如果需要区分,需要
在clone方法里面加上:this.arrayList = (ArrayList<String>)this.arrayList.clone();
同时注意:深拷贝的时候,属性就不要加final,它俩是一对冤家。


4. 应用场景:需要创建大量同一类型的对象,同时他们大部分属性是相同的,仅小部分不同。


二. 工厂方法模式


1. 定义:Define an interface for creating an object,but let subclasses decide which class to instance.
         Factory Method lets a class defer instantiation to subclasses.


2. 简单点说,定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使用一个类的实例化延迟到其子类。


3. 通用的类图,此处略


4. 特点:
   * 符合迪米特,依赖倒置,里氏替换。
   * 是new一个对象的替代品。
   * 需要灵活,可扩展的框架时,如连接邮件服务器的框架,有三种网络协议:POP3,IMAP,HTTP,可以把三种连接方法作为产品类。
   * 可以用在异构项目,如webservice与非java交互,从wsdl中产生的对象都认为是一个产品。
   * 测试驱动开发的框架下,测试类A,可以通过工厂方法将其关联的类B虚拟出来。当然可以直接使用JMock和EasyMock。
   * 将工厂类的方法静态化,就成了简单工厂,缺点是扩展比较困难,不符合开闭原则。
   * 当初始化一个对象很耗费精力(不仅仅使new,还需要设置一个属性的初始值),产品较多的时候,考虑到需要结构清晰,可以为
     每个产品定义一个创造者,调用者自己决定与哪个工厂方法关联。(每一个具体的工厂都已经非常明确自己的职责:创建自己负
     责的产品类对象) 缺点:扩展一个产品类,就需要建立一个相应的工厂。在复杂的应用中,一般多采用多工厂的方法,然后增加
     一个协调类,避免调用者与各个子工厂交流,协调类的作用就是封装子工厂类,对高层模块提供统一的接口。
   * 可以产生一个单例构造器,所有需要产生单例的类都遵循一定的规则(构造方法是private),然后通过扩展该框架,只需输入一个
     类型就可以获得唯一的一个实例。
   * 延迟加载的工厂类:

public class Factory {private static final Map<String,Product> prMap = new HashMap();public static synchronized  Product createProduct(String type) throws Exception{Product product =null;//如果Map中已经有这个对象if(prMap.containsKey(type)){product = prMap.get(type);}else{if(type.equals("Product1")){product = new ConcreteProduct1();}else{product = new ConcreteProduct2();}//同时把对象放到缓存容器中prMap.put(type,product);}return product;}}



5. 应用场景:
   JDBC连接数据库


三. 建造者模式
1. 定义:Separate the construction of a complex object from its representation so that the same construction process
         can create different representations.


2. 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。


3. 通用的类图
Director --> Builder  <-- Concrete Builder  --> Product


4. 特点:
   * 封装性:客户端不必知道产品内部细节
   * 建造者独立,易扩展
   * 便于控制细节风险,由于是独立的,可以对建造过程逐步细化,而不对其他模块产生任何影响。
   * 建造者关注的是零件类型和装配工艺(顺序),这是它与工厂方法模式最大不同之处。


5. 应用场景:
   * 相同的方法,不同的执行顺序,产生不同的事件结果
   * 多个部件或零件,都可以装配到一个对象中,但产生的运行结果又不相同时
   * 产品类非常复杂,产品类中的调用顺序不同产生不同的效能
   * 对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象创建的过程中不容易得到


四. 模板方法模式
1. 定义:Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.
         Template Method lets subclasses redefine certain steps of an algorithm without changing
the algorithm's structure.


2. 定义一个操作中的算法框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义
   该算法的某些特定步骤。


3. 特点:
   * 为了防止恶意的操作,一般模板方法都加上final关键字,不允许被重写。
   * 封装不变性,扩展可变内容
   * 行为由父类控制,子类实现,符合开闭
   * 


5. 应用场景:
   * 多个子类有公有的方法,并且逻辑体基本相同
   * 重要复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能由子类实现。
   * 重构时,把相同的代码抽取到父类中,然后通过钩子函数约束其行为。

0 0