Java设计模式之—Factory Method模式(工厂模式)
在Factory Method模式中,父类决定实例的生成方式,但并不决定所要生成的具体的类。具体的处理全部交给子类负责。这样就可以将生成实例的框架(framework)和实际负责生成实例的类解耦。
应用场景
1、当一个类不知道它所需要的对象的类时
在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可;
2、当一个类希望通过其子类来指定创建对象时
在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏代换原则,在程序运行时,子类对象将覆盖父类对象,从而使得系统更容易扩展。
3、将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无须关心是哪一个工厂子类创建产品子类,需要时再动态指定,可将具体工厂类的类名存储在配置文件或数据库中。
Product抽象类
public abstract class Product {
public abstract void use();
}
IDCard类(继承Product抽象类)
public class IDCard extends Product {
private String owner;
public IDCard(String owner) {
System.out.println("制作" + owner + "的ID卡。");
this.owner = owner;
}
@Override
public void use() {
System.out.println("使用" + owner + "的ID卡!");
}
public String getOwner() {
return owner;
}
}
Factory抽象类
定义了实例的生成方式,但并不确定要生成的具体的类(如下,Product是抽象类,并不是具体的类),具体的处理全部交给子类负责。
这样就可以将生成实例的框架和实际负责生成实例的类解耦。
public abstract class Factory {
protected abstract Product createProduct(String owner);
protected abstract void registerProduct(Product product);
public final Product create(String owner) {
Product product = createProduct(owner);
registerProduct(product);
return product;
}
}
IDCardFactory类(继承Factory抽象类)
定义了实例的具体生成方式。
import java.util.ArrayList;
import java.util.List;
public class IDCardFactory extends Factory {
private List owners = new ArrayList();
@Override
protected Product createProduct(String owner) {
return new IDCard(owner);
}
@Override
protected void registerProduct(Product product) {
owners.add(((IDCard) product).getOwner());
}
public List getOwers() {
return owners;
}
}
Clienter类(测试类)
public class Clienter {
public static void main(String[] args) {
Factory factory = new IDCardFactory();
Product card1 = factory.create("zhongyp");//制作zhongyp的ID卡。
Product card2 = factory.create("z先生");//制作z先生的ID卡。
Product card3 = factory.create("昵称");//制作昵称的ID卡。
card1.use();//使用zhongyp的ID卡!
card2.use();//使用z先生的ID卡!
card3.use();//使用昵称的ID卡!
}
}