0%

java-设计模式(二)

三、建造者模式(Builder)

建造者模式可以将一个类的构建和表示进行分离

适用场景:

  • 隔离复杂对象的创建和使用,相同的方法,不同执行顺序,产生不同事件结果
  • 多个部件都可以装配到一个对象中,但产生的运行结果不相同
  • 产品类非常复杂或者产品类因为调用顺序不同而产生不同作用
  • 初始化一个对象时,参数过多,或者很多参数具有默认值
  • Builder模式不适合创建差异性很大的产品类
    产品内部变化复杂,会导致需要定义很多具体建造者类实现变化,增加项目中类的数量,增加系统的理解难度和运行成本
  • 需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;

开发中应用场景:

  • StringBuilder类的append方法
  • SQL中的PreparedStatement
  • JDOM中,DomBuilder、SAXBuilder

参考文章:

一篇文章就彻底弄懂建造者模式(Builder Pattern) - 简书 (jianshu.com)

四、原型模式(prototype)

使用原型实例指定要创建对象的类型,通过复制这个原型来创建新对象。

适用场景

  • 通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式
  • 就是java中的克隆技术,以某个对象为原型,复制出新的对象。显然,新的对象具备原型对象的特点。优势有:效率高(直接克隆,避免了重新执行构造过程步骤)
  • 克隆类似于new,但是不同于new。new创建新的对象属性采用的是默认值。克隆出的 对象的属性值完全和原型对象相同。并且克隆出的新对象改变不会影响原型对象。然后, 再修改克隆对象的值。

原型模式实现

  • Cloneable接口和clone方法
  • Prototype模式中实现起来最困难的地方就是内存复制操作,所幸在Java中提供了 clone()方法替我们做了绝大部分事情。

例子:

1
2
3
public abstract class Prototype {
abstract Prototype myClone();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class ConcretePrototype extends Prototype {

private String filed;

public ConcretePrototype(String filed) {
this.filed = filed;
}

@Override
Prototype myClone() {
return new ConcretePrototype(filed);
}

@Override
public String toString() {
return filed;
}
}
1
2
3
4
5
6
7
public class Client {
public static void main(String[] args) {
Prototype prototype = new ConcretePrototype("abc");
Prototype clone = prototype.myClone();
System.out.println(clone.toString());
}
}
1
abc