1、模式说明java
在前一个模板方法(Template Method)模式中,父类定义了处理流程,而流程中用到的方法交给子类去实现。相似的,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类,具体的处理交由子类来处理。这样能够将生成实例的框架和实例自己解耦。面试
工厂方法模式在不少框架中都有用到,在面试中也问的比较多的,须要重点理解把握。框架
2、工厂方法(Factory Method)模式类图ide
3、工厂方法(Factory Method)模式中的角色学习
4、工厂方法(Factory Method)代码示例:this
一、模式框架类的建立,Product类:spa
package com.designpattern.cn.factorymethodpattern.patternframework; public abstract class Product { public abstract void use(); }
二、模式框架类的建立,Factory类:设计
package com.designpattern.cn.factorymethodpattern.patternframework; public abstract class Factory { public final Product create(String owner){ Product product = this.createProduct(owner); this.registerProduct(product); return product; } protected abstract Product createProduct (String owner); protected abstract void registerProduct(Product product); }
三、模式实现类,IDCard身份证类:3d
package com.designpattern.cn.factorymethodpattern.patterndemostrate; import com.designpattern.cn.factorymethodpattern.patternframework.Product; public class IDCard extends Product { private String owner; IDCard(String owner){ System.out.println("制做" + owner + "的ID卡"); this.owner = owner; } public void use(){ System.out.println("使用" + this.owner + "的ID卡"); } public String getOwner() { return owner; } }
四、模式实现类,IDCardFactory类:code
package com.designpattern.cn.factorymethodpattern.patterndemostrate; import com.designpattern.cn.factorymethodpattern.patternframework.Factory; import com.designpattern.cn.factorymethodpattern.patternframework.Product; import java.util.ArrayList; import java.util.List; public class IDCardFactory extends Factory { private List owners = new ArrayList(); protected Product createProduct(String owner){ return new IDCard(owner); } protected void registerProduct(Product product){ owners.add(((IDCard)product).getOwner()); } public List getOwners(){ return owners; } }
五、Main方法类与运行结果:
上面的代码示例中,工厂模式的createProduct是一个抽象方法,必须在子类中实现该方法,具体能够选择三种实现方式:
public Product createProduct(String name){
return new Product(name);
}
若是采用这种方式,Product类就不能定义为抽象类。
3.抛出异常的方式:
public Product createProduct(String name){
throw new FactoryMethodRuntimeException();
}
这样一来,就必须在子类中重写该方法,不然会抛出异常。
5、工厂方法(Factory Method)模式相关的模式