如今生活中用的吃的东西,大家都知道他们是怎么产生的吗?都知道是从工厂中生产出来的,但是具体怎么生产的就不知道了。工厂负责生产东西,我们负责使用东西,而对于如何生产,我们不关心。
这就是工厂方法模式,决定实例对象的生成方式,生成对象供用户使用,向用户隐藏对象生成细节。【工厂方法模式是模版方法模式在生成实例方面的衍生】
假设现在要为每个人制作ID卡,用户不关心ID卡的生成,只关心ID卡的使用,因此抽象出一个 Product 类,其中只有一个抽象方法 use,表示产品的使用:
public abstract class Product { public abstract void use(); }而后定义ID卡类 IDCard,使其继承 Product 类,并在其中实现 use 类
public class IDCard extends Product { private final String owner; 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; } }为了让用户拿到 IDCard 对象,我们需要定义一个工厂类,在模版方法模式中我们知道,我们要先定义一个抽象类,将生产对象的流程定下来,而后每一步流程具体实现由子类来进行填充重写,代码如下:
public abstract class Factory { public final Product create(String owner){ Product product = createProduct(owner); registerProduct(product); return product; } protected abstract Product createProduct(String owner); protected abstract void registerProduct(Product product); }定义具体工厂类:
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 getOwners() { return owners; } }然后,用户就可以通过工厂对象的 create 方法来获取不同的 IDCard对象啦:
public class Main { public static void main(String[] args) { Factory factory = new IDCardFactory(); Product card1 = factory.create("小明"); Product card2 = factory.create("小红"); Product card3 = factory.create("小刚"); card1.use(); card2.use(); card3.use(); } }