1、意图
简单工厂的作用是实例化对象,而不需要客户了解这个对象属于哪个具体的子类。
在 GoF 的设计模式中并没有简单工厂,而是把它作为工厂方法的一个特例加以解释,可
以这样来理解,简单工厂是参数化的工厂方法,由于它可以处理粒度比较大的问题,所以还
是单独列出来比较有利。
2、使用场合和效果
简单工厂实例化的类具有相同的接口,类的个数有限而且基本上不需要扩展的时候,可
以使用简单工厂。
使用简单工厂的优点是用户可以根据参数获得类的实例,避免了直接实例化类的麻烦,
降低了系统的耦合度。缺点是实例化的类型在编译的时候已经确定,如果增加新的类,需要
修改工厂。
简单工厂需要知道所有要生成的类型,在子类过多或者子类层次过多的时候并不适合使
用。
3、结构
通常简单工厂不需要实例化,而是采用静态方法来实现。下面是一个简单工厂的基本框
架,Factory 类为工厂类,里面的静态方法 PaymentFactory 决定了实例化哪个子类,而在这
个方法里面,通过多分支语句来控制具体实现的子类。
// Payment.java
public abstract class Payment{
private double amount;
public double getAmount(){
return amount;
}
public void setAmount(double value){
amount = value;
}
public String goSale(){
String x = "不变的流程一 ";
x += Action(); //可变的流程
x += amount + ", 正在查询库存状态"; //属性和不变的流程二
return x;
}
public abstract String Action();
}
class CashPayment extends Payment{
public String Action(){
return "现金支付";
}
}
// CreditPayment.java
public class CreditPayment extends Payment{
public String Action(){
return "信用卡支付,联系支付机构";
}
}
class CheckPayment extends Payment{
public String Action(){
return "支票支付,联系财务部门";
}
}
//这是一个工厂类 Factory.java
public class Factory{
public static Payment PaymentFactory(String PaymentName){
Payment mdb=null;
if (PaymentName.equals("现金"))
mdb=new CashPayment();
else if (PaymentName.equals("信用卡"))
mdb=new CreditPayment();
else if (PaymentName.equals("支票"))
mdb=new CheckPayment();
return mdb;
}
}
调用:
public class Test{
public static void main (String[] args){
Payment o;
o = Factory.PaymentFactory("现金");
o.setAmount(555);
System.out.println(o.goSale());
o = Factory.PaymentFactory("信用卡");
o.setAmount(555);
System.out.println(o.goSale());
o = Factory.PaymentFactory("支票");
o.setAmount(555);
System.out.println(o.goSale());
}
}