读书人

工场(Factory)模式

发布时间: 2012-10-11 10:16:10 作者: rapoo

工厂(Factory)模式

简单工厂模式又称为静态工厂方法(Static Factory Method)模式,因为类中负责创建对象的方法是个静态方法。

简单工厂模式的类图如图4-22所示。

工场(Factory)模式图4-22 简单工厂的类图
a) 详细画法 b) 简单画法

从图4-22 a中可知,产品部分就是一个前面已经用熟了的典型抽象类--具体子类架构,而工厂一边则应该是用运算符new来产生具体产品的部分。

下面通过例子来了解简单工厂模式的代码和实际类图结构。

【例4-7】 助学金的简单工厂模式实现。

(1)助学金简单工厂模式的类图结构

助学金的简单工厂模式的类图结构如图4-23所示。

可以看到,产品角色部分与前面讲的策略模式一模一样,也采用了抽象类把可变的具体产品与客户隔离开来;而工厂类Factory则含有一个静态factory()方法,并在该方法中使用new运算符来为客户生产各种具体产品(对象)。

工场(Factory)模式(点击查看大图)图4-23 助学金的简单工厂模式类图

(2)程序代码

程序代码如下:

/*接口*/public interface Stipend{public void Payoff();}/*封装本科生助学金算法的类*/public class GranduateStipend implements Stipend{public void Payoff(){System.out.println("发放本科生助学金");}}/*封装硕士生助学金算法的类*/public class MasterStipend implements Stipend{public void Payoff(){System.out.println("发放硕士生助学金");}}/*封装博士生助学金算法的类*/public class DoctorStipend implements Stipend{public void Payoff(){System.out.println("发放博士生助学金");}}/*会计(工厂类)*/public class Factory{public static Stipend factory(String Num) /*工厂方法*/throws BadNumException{if(Num.equals("1")) return new GranduateStipend();else if(Num.equals("2")) return new MasterStipend();else if(Num.equals("3")) return new DoctorStipend();else throw new BadNumException("Bad Num");}}/*异常类*/public class BadNumException extends Exception{public BadNumException(String msg){super(msg);}}/*测试类*/public class Main{public static void main(String[] args){try{Factory.factory(args[0]).Payoff();}catch(BadNumException e){System.out.println("No Number");}}}

从Factory类的代码中可以看到,由于使用了工厂方法,不仅把创建对象的工作移到了服务器端,并且由于该方法是静态的,所以在客户端也免去了创建Factory对象的麻烦,使得该语句中也没有了运算符new。

其实,前面在介绍单例模式时已经使用了简单工厂模式,只不过它创建了自身的实例。

读书人网 >其他相关

热点推荐