利用工厂模式封装对象变化
2009-02-13 23:04
204 查看
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());
}
}
简单工厂的作用是实例化对象,而不需要客户了解这个对象属于哪个具体的子类。
在 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());
}
}
相关文章推荐
- 自己在项目中的学习总结:利用工厂模式+反射机制+缓存机制,实现动态创建不同的数据层对象接口
- 工厂模式:封装对象的创建(三、抽象工厂)
- 利用外观模式封装类的变化
- 利用桥接模式封装业务单元变化
- 在工厂模式里面利用反射机制动态调用对象方法
- 利用反射动态实例化对象(工厂模式)
- PHP工厂模式的好处【实例化对象的封装处理】
- 设计技巧11:静态创建方法(非设计模式中的工厂方法) 利用一个静态的方法封装构建器
- 用工厂函数封装对象
- Symbian常用设计模式之可伸缩对象工厂
- 利用反射技术完善工厂模式
- java 接口引用指向对象 / 工厂模式
- 策略模式:把会变化的部分取出并封装起来
- Builder模式的误区:将复杂对象的构建进行封装,就是Builder模式了吗?
- JavaSE实战——面向对象(上) 封装,继承,对象初始化流程,单例设计模式
- .Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--使用封装的网络服务4[聊天室][使用IE浏览本页]
- js原生设计模式——7原型模式之真正的原型模式——对象复制封装
- C#面向对象设计模式纵横谈(四) --- Factory Method 工厂方法(创建型模式)
- 获取对象的一步步演变-工厂模式
- 利用fastjson将map数据封装到对象中