简单来说,用Template Method模式来构建生成实例的工厂,就是Factory Method模式。在这个模式中,父类决定实例的生成方式,但不决定所要生成的具体的类,具体的处理全部交给子类负责。这样就可以将生成实例的框架和实际负责生成实例的类解耦。

  下面的示例中,framework包是生成实例的框架。而idcard包是负责加工处理的。

  首先根据下面的实例代码来解释一下这种常用的设计模式。

 package BigJunOba.bjtu.framework;

 public abstract class Product {
public abstract void use();
}

  Product抽象类属于framework包。这个类用来表示“产品”,定义了use方法,定义了“产品”是“任意的可以use的”东西。

 package BigJunOba.bjtu.framework;

 public abstract class Factory {

     public final Product create(String owner) {
Product p = createProduct(owner);
registerProduct(p);
return p;
} protected abstract Product createProduct(String string);
protected abstract void registerProduct(Product product);
}

  Factory抽象类也属于framework包。在这里使用了Template Method模式,protected关键字说明只能被子类继承。最主要的create方法的意思是,通过create方法来生成Product实例。而create方法的实现是先调用createProduct生成产品,然后调用registerProduct方法注册产品。

 package BigJunOba.bjtu.idcard;

 import BigJunOba.bjtu.framework.Product;

 public class IDCard extends Product {

     private String owner;

     IDCard(String owner) {
System.out.println("制作" + owner + "的ID卡");
this.owner = owner;
} @Override
public void use() {
System.out.println("使用" + owner + "的ID卡");
} public String getOwner() {
return owner;
}
}

  IDCard类属于idcard包。作为Product的子类,用来表示ID卡。

 package BigJunOba.bjtu.idcard;

 import java.util.ArrayList;
import java.util.List; import BigJunOba.bjtu.framework.Factory;
import BigJunOba.bjtu.framework.Product; public class IDCardFactoty extends Factory{ private List<String> owners = new ArrayList<String>(); @Override
protected Product createProduct(String owner) {
return new IDCard(owner);
} @Override
protected void registerProduct(Product product) {
owners.add(((IDCard)product).getOwner());
} public List<String> getOwners() {
return owners;
}
}

  IDCardFactoty类也属于 idcard包。用来实现createProduct和registerProduct两种方法。

 package BigJunOba.bjtu.test;

 import BigJunOba.bjtu.framework.Factory;
import BigJunOba.bjtu.framework.Product;
import BigJunOba.bjtu.idcard.IDCardFactoty; public class Main {
public static void main(String[] args) {
Factory factory = new IDCardFactoty();
Product card1 = factory.create("廉酱");
Product card2 = factory.create("桥爷");
card1.use();
card2.use();
}
}

  测试类属于test包。这里是用工厂来创建ID卡的示例,然后再调用相关的方法。

制作廉酱的ID卡
制作桥爷的ID卡
使用廉酱的ID卡
使用桥爷的ID卡

  测试结果如上图所示。

  Factory Method模式的类图如上图所示。使用工厂方法设计模式的好处是,本实例中,framework包中没有引入idcard包,在Product类和Factory类中,也没有出现IDCard和IDCardFactory等具体类的名字。因此,即使用也有的框架生成全新的类时,也完全不需要对framework包进行修改。通俗来说,就是“framework包不依赖于idcard包”。

最新文章

  1. 求子串-KPM模式匹配-NFA/DFA
  2. WPF中的image控件的Source赋值
  3. CentOS 7部署OpenStack(二)—安装keystone服务
  4. 爱上MVC3系列~开发一个站点地图(俗称面包屑)
  5. Java Arrays 排序
  6. ajax使用post提交中文
  7. SlidingMenu实战系列
  8. 【mysql】之MySQL导入sql脚本错误:2006 - MySQL server has gone away
  9. NGUI 3.5教程(六)Font字体
  10. Android(java)学习笔记248:ContentProvider使用之虚拟短信
  11. PHP读取EXCEL时写入数据乱码解决办法
  12. 关于eclipse中代码与SVN服务器关联问题
  13. 代码中引用res里的颜色、图片
  14. npm package.json文件解读
  15. 并发思考-actor和thread那个好点?
  16. Linux大页内存管理等---菜鸟初学
  17. 【Spark】Spark性能调优
  18. 20155228 2016-2017-2 《Java程序设计》第4周学习总结
  19. Web测试——功能测试
  20. delphi shr和shl的作用

热门文章

  1. 使用最新版Mybatis逆向工程生成属性不全的问题
  2. mapper操作数据的同时返回操作后的值
  3. Springboot2.x整合RabbitMQ
  4. 经典案例复盘——运维专家讲述如何实现K8S落地(摘抄)
  5. at,crontab例行性任务
  6. Akka实现WordCount(Scala)
  7. (八十四)c#Winform自定义控件-导航菜单(类Office菜单)
  8. SpannableString与SpannableStringBuilder
  9. C#中winform中panel重叠无法显示问题
  10. mysql中间件分享(Mysql-prxoy,Atlas,DBProxy,Amoeba,cobar,TDDL)