版权声明:本文为博主原创,未经允许请不要转载哦 https://blog.csdn.net/weixin_43277507/article/details/88322597
最近在用Java写图书管理系统,目前全部代码已经上传到GitHub(https://github.com/TriciaCX)。
在优化代码的过程中,用到了工厂方法模式,简单总结一下。
工厂方法模式是常用的设计模式之一,其定义为:Define an interface for creating an object, but let subclass decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.翻译一下就是:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。(《设计模式之禅》)
结合个人理解,工厂方法的核心思想是“来料加工”。从工厂角度来说,针对不同的“客户需求”,定制不同的“产品”。从客户角度来说,客户提出需求之后,工厂才会加工产品(延迟到子类才开始实例化)。
这是在图书管理系统中定义的业务工厂类。
/**
* 业务工厂类
* 工厂模式:来料加工,传给BizFactory类一个字符串,根据字符串返回相应的子类实现
* @author Tricia
* @version 4
*/
public class BizFactory
{
/**
* 根据业务类的名称,获得相应业务类的实现
* 目前已实现业务类:图书信息业务类、用户业务类(实现权限管理)
* @param bizName
* @return
*/
public static Biz getBiz(String bizName) {
switch(bizName.toLowerCase()) {
case "bookinfobiz":
return new BookInfoBizImplV1();
case "userbiz":
return new UserBizImplV1();
// 当需要拓展业务类时,在此处增加即可
default:
return null;
}
}
}
这是在图书管理系统中定义的实例化子类(部分代码)
public Role() {
setName("默认角色");
setKey("default");
//bookInfoBiz = new BookInfoBizImplV1(); //"硬"编码实现--可以改成工厂模式来获得子类实现。
//工厂模式
bookInfoBiz = (BookInfoBiz)BizFactory.getBiz("BookInfoBiz");
creatPermissions();
}
/**
* 创建给定角色名和权限key的角色
* 权限key对应一个字符串(参见Role_Permissons.properties),将该字符串分割成数组,逐个赋值给permissions集合
* @param name
* @param key
*/
public Role(String name,String key) {
setName(name);
setKey(key);
bookInfoBiz = (BookInfoBiz)BizFactory.getBiz("BookInfoBiz");
creatPermissions();
}
通过上述的例子,我们可以很直观地感受到工厂方法模式的优点。相比于原始方法,工厂方法模式有很好的扩展性,当日后需要再增加或改进实现的业务类时,也就是工厂方法中的产品类时,只要新增一个产品类或者修改相应的产品类。