原型模式(builder) - 图1


原型模式是构造性模式中的一种,它的宗旨就是创建重复的对象,通过克隆,充分保障性能。

源代码地址

源码连接

UML

类图就不画了,就是通过clone出一个新对象

源码分析
小刚热衷于大保健,还是通过小刚大保健的例子说明
见注释分析
一个大保健服务

  1. public class BigHealthCare implements Cloneable{
  2. private String serviceName;//服务名称
  3. public BigHealthCare(String serviceName) {
  4. this.serviceName = serviceName;
  5. }
  6. public String getServiceName() {
  7. return serviceName;
  8. }
  9. public void setServiceName(String serviceName) {
  10. this.serviceName = serviceName;
  11. }
  12. @Override
  13. public BigHealthCare clone() throws CloneNotSupportedException {
  14. return new BigHealthCare(serviceName);
  15. }
  16. @Override
  17. public String toString() {
  18. return "{"
  19. + "\"serviceName\":\"" + serviceName + "\""
  20. + "}";
  21. }
  22. }

小刚要做大保健

  1. public class Test {
  2. public static void main(String args[]){
  3. //小刚要做大保健服务,但是大保健服务有很多种,有洗脚、按摩、papapa。
  4. //小刚呼叫了一号技师,说要做个洗脚服务
  5. BigHealthCare simpleBighealthcare = new BigHealthCare("洗脚");
  6. System.out.printf("一号技师给小刚做了个"+simpleBighealthcare.getServiceName()+"服务\n");
  7. //小刚说一号技师不错,还想来个按摩,于是加了个服务
  8. try {
  9. BigHealthCare generalBighealthcare = simpleBighealthcare.clone();
  10. generalBighealthcare.setServiceName("按摩");
  11. System.out.printf("一号技师给小刚做了个"+generalBighealthcare.getServiceName()+"服务\n");
  12. } catch (CloneNotSupportedException e) {
  13. e.printStackTrace();
  14. }
  15. //技师手法把小刚弄的欲罢不能,于是小刚还想加服务
  16. try {
  17. BigHealthCare specialBighealthcare = simpleBighealthcare.clone();
  18. specialBighealthcare.setServiceName("papapa");
  19. System.out.printf("一号技师给小刚做了个"+specialBighealthcare.getServiceName()+"服务\n");
  20. } catch (CloneNotSupportedException e) {
  21. e.printStackTrace();
  22. }
  23. //那么问题来了小刚为什么要这么做呢,为什么不每次通过new一下叫个技师来呢?原因有二
  24. //1.小刚服务做得正爽,也就是在run-time时期,可以实现动态加服务
  25. //2.小刚觉得1号技师长得好,技术也好(保持对象原有状态),要是new了一个不好的来就不爽了(浪费资源)。
  26. }
  27. }