定义:,它定义了一个创建对象的接口,但是却让子类来决定具体实例化哪一个类.当一个类无法预料要创建哪种类的对象或是一个类需要由子类来指定创建的对象时我们就需要用到Factory Method 模式了.简单说来,Factory Method可以根据不同的条件产生不同的实例,当然这些不同的实例通常是属于相同的类型,具有共同的父类.Factory Method把创建这些实例的具体过程封装起来了,简化了客户端的应用,也改善了程序的扩展性,使得将来可以做最小的改动就可以加入新的待创建的类. 通常我们将Factory Method作为一种标准的创建对象的方法,当发现需要更多的灵活性的时候,就开始考虑向其它创建型模式转化。
结构图:
public class LeiFeng {
public void Sweep(){
System.out.println("扫地");
}
public void Wash(){
System.out.println("洗衣服");
}
}
public class Undergraduate extends LeiFeng{
}
public class Voluteer extends LeiFeng{
}
<pre name="code" class="java">public interface IFactory {
LeiFeng createLeiFeng();
}
public class VounlteerFactory implements IFactory{
@Override
public LeiFeng createLeiFeng() {
return new Voluteer();
}
}
public class UndergraduateFactory implements IFactory{
@Override
public LeiFeng createLeiFeng() {
return new Undergraduate();
}
}
public class SimpleFactory{
public static LeiFeng createLeiFeng(int type){
LeiFeng result = null;
switch (type) {
case 1:
result = new Undergraduate();
break;
case 2:
result = new Voluteer();
break;
default:
break;
}
return result;
}
}
public class Client {
public static void main(String[] args) {
//LeiFeng xueleifeng1 = new Undergraduate();
//xueleifeng1.Sweep();
//LeiFeng leiFeng2 = new SimpleFactory().createLeiFeng(1);
//leiFeng2.Wash();
//要换成社区的只需要改一处
IFactory iFactory = new UndergraduateFactory();
LeiFeng student = iFactory.createLeiFeng();
student.Wash();
}
}
<span style="font-family: arial, nsimsun, sans-serif; font-size: 13px; line-height: 26px;">用Factory Method模式创建对象并不一定会让我们的代码更短,实事上往往更长,我们也使用了更多的类,真正的目的在于这样可以灵活的,有弹性的创建不确定的对象.而且,代码的可重用性提高了,客户端的应用简化了,客户程序的代码会大大减少,变的更具可读性。</span>