设计模式(2): 工厂方法模式 Factory Method

工厂模式可以理解为简单工厂的修复版,增加要生产的对象的时候可以不用修改的你工厂,只用增加相应的生产类就行了,符合设计模式的那个什么什么规范。

工厂方法模式 Factory Method

问题:

A framework needs to standardize the architectural model for a range of applications, but allow for individual applications to define their own domain objects and provide for their instantiation.

意图:

  • Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.
  • Defining a “virtual” constructor.
  • The new operator considered harmful.

代码:

接上面的简单工厂:比如我想多加一个“吃饺子”的动作,最少加加两个地方,加入“饺子”的实现类目,另外在工厂里面对“饺子”进行判断,有代码洁癖的同学就喜欢用工厂方法去解决了。

代码一:抽象工厂与抽象对象内(食物工厂与食物实体)

package com.xdnote.DesignPattern.creational.factoryMethod;

public interface FoodFactory {
    public Food createFood();
}
public interface Food {
    /**
     * 定义特性方法,食物都是可以吃的,定义一个方法 eat
     * @return String
     * */
    public String eat() ;
}

代码二:包子,馒头等实物类

package com.xdnote.DesignPattern.creational.factoryMethod;
/**
 * 包子类
 * @author xdnote
 * **/
public class Baozi implements Food {
    @Override
    public final String eat() {
        return "送你吃包子";
    }
}
public class Mantou implements Food {
    @Override
    public String eat() {
        return "请你吃馒头";
    }
}

代码三:包子,馒头等工厂类

package com.xdnote.DesignPattern.creational.factoryMethod;

public class BaoziFactory implements FoodFactory{
    @Override
    public Food createFood() {
        return new Baozi();
    }
}
public class MantouFactory implements FoodFactory{
    @Override
    public Food createFood() {
        return new Mantou();
    }
}

代码4:客户端调用

    public static void main(String[] args){
        FoodFactory factory = new BaoziFactory();
        Food food = factory.createFood();
        System.out.println(food.eat());
    }

小结

OK,工厂方法原型如上,和简单工厂作用是一样,复杂了一些,为什么要用工厂方法,设计模式里面有一条原则(貌似叫什么开放封闭原则)就是比如上面的功能要是加一个饺子类,最好不要修改到原来的类,我只用加一个饺子工厂和一个饺子类就能搞定了,只有新增没有修改,客户端爱用不用。代码就不再写了,参考包子馒头。

  • 使用频率:极高
    很少见到玩面向对象语言没到用工厂方法的。要么是你的项目确实太小,要么是你用了都不知道。另外,如果集成框架扩展什么的,基本上也都有用到同,只是你自己遵循框架的工厂规范写了生产类而已。
  • 利弊影响:
    利:更灵活了,更易扩展了,思想易理解,有一点点经验的程序员闭眼也能写出一个标准的工厂来。
    弊:相比简单工厂,一下子要多写好多个文件(普遍存在于后面的模式中)
  • 小评:
    和简单工厂比起来复杂了那么一点点,需要实际操作理解。但使用还是相当广泛的,特别是各种框架通常使用工厂方法来扩展功能,主流框架SSH都有一部分用到工厂方法,自己动手敲的工厂方法模式也不少,各种面向对象语言自己搭MVC不必多说,即使非面向对象的语言如php,JavaScript有时候都能见到工厂方法的身影。