一、工厂方法模式
定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类所谓的决定并不是批模式允许子类本身在运行时做决定,而是指在编写创建者类时,不需知道创建的产品是哪一下,选择了使用
哪个子类,就决定了实际创建的产品是什么。
二、使用范例
/**
* 文件名:factorymethod.java
* 描述:工厂模式讲解
* 创建人:林炳文
* 日 期:2015.1.26
**/
package factory;
/**抽象产品类,**/
abstract class Product{
public abstract void use();
}
/**具体产品类,低级会员卡**/
class IdcardLow extends Product{
private String owner;//当前要建卡的人名
//建卡的构造函数
IdcardLow(String owner)
{
this.owner=owner;
}
//重载函数
@Override
public void use() {
System.out.println("这是低级会员"+owner+"在用卡");
}
}
/**具体产品类,高级会员卡**/
class IdcardHigh extends Product{
private String owner;//当前要建卡的人名
//建卡的构造函数
IdcardHigh(String owner)
{
this.owner=owner;
}
//重载函数
@Override
public void use() {
System.out.println("这是高级会员"+owner+"在用卡");
}
}
/**抽象工厂类,**/
abstract class Factory{
protected abstract Product CreateProduct(String owner);
}
/**具体工厂类,专门生产低级会员卡**/
class FactoryLow extends Factory{
//重载函数
@Override
protected Product CreateProduct(String owner) {
return new IdcardLow(owner);
}
}
/**具体工厂类,专门生产高级会员卡**/
class FactoryHigh extends Factory{
//重载函数
@Override
protected Product CreateProduct(String owner) {
return new IdcardHigh(owner);
}
}
public class factorymethod {
public static void main(String[] args) {
Factory factory1=new FactoryLow();
Factory factory2=new FactoryHigh();
/*根据 人名生产低级会员卡*/
Product card1=factory1.CreateProduct("小明");
Product card2=factory1.CreateProduct("小红");
/*根据 人名生产高级会员卡*/
Product card3=factory2.CreateProduct("大明");
Product card4=factory2.CreateProduct("大红");
card1.use();
card2.use();
card3.use();
card4.use();
}
}
效果:
三、工厂方法模式优缺点
优点:
实现了基于工厂角色和产品角色的多态性设计。它能够使工厂自主确定创建何种产品对象,而如何创建这个对象的细节完全封装在具体工厂内部。另外,系统中加入新产品时,无需修改抽象工厂提供的接口,无需修改其它的具体工厂,只需要添加新的具体工厂和产品。
缺点:
需要Creator和相应的子类作为工厂方法的载体,增加了一个层次。
联系:
工厂方法模式是简单工厂模式的进一步抽象和推广,定义了工厂接口,将实际的创建工作推迟到子类中,如果只有一个具体工厂类,可以改造为简单工厂模式。