Java设计模式--工厂方法模式【Factory Method Pattern】

时间:2022-10-02 16:05:00

       工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担,程序大大提高了灵活性——当有新的产品时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,而不必去修改任何已有的代码,程序提高了扩展性,同时也符合”开闭原则“。

       沿用简单工厂方法模式中的例子,随着《中餐厅》的火爆之泰国程度,顾客量越来越大,从起初的湘菜、川菜、东北菜逐次扩至粤菜、香港菜,为了满足“开闭原则”,减少菜品和工厂的耦合度,采用工厂方法模式对《中餐厅》进行了改良。

package com.pattern.factory.pub;

public interface Food {
public void cooking(String foodName);
}
package com.pattern.factory.pub;public class HuNanFood implements Food {public void cooking(String foodName) {System.out.println("【"+foodName+"】上来咯!");}}
package com.pattern.factory.pub;public class SiChuanFood implements Food {@Overridepublic void cooking(String foodName) {System.out.println("【"+foodName+"】上来咯!");}}
package com.pattern.factory.pub;public class DongBeiFood implements Food {@Overridepublic void cooking(String foodName) {System.out.println("【"+foodName+"】上来咯!");}}
       抽象出工厂的统一接口,每一种菜系定义一类工厂,分别去与“接口”对接,不同的菜系分别用不同的工厂生产,这样即使工厂A出了问题,不会影响工厂B,减少风险的发生以及提高可扩展性。  
      
package com.pattern.factory.method;

import com.pattern.factory.pub.Food;

public interface FoodFactory {

public Food createFood(String foodName);
}
package com.pattern.factory.method;import com.pattern.factory.pub.Food;import com.pattern.factory.pub.HuNanFood;public class HuNanFoodFactory implements FoodFactory {public Food createFood(String foodName) {HuNanFood food=new HuNanFood();food.cooking(foodName);return food;}}
package com.pattern.factory.method;import com.pattern.factory.pub.Food;import com.pattern.factory.pub.SiChuanFood;public class SiChuanFoodFactory implements FoodFactory{public Food createFood(String foodName) {SiChuanFood food=new SiChuanFood();food.cooking(foodName);return food;}}
package com.pattern.factory.method;import com.pattern.factory.pub.DongBeiFood;import com.pattern.factory.pub.Food;public class DongBeiFoodFactory implements FoodFactory {public Food createFood(String foodName) {DongBeiFood food=new DongBeiFood();food.cooking(foodName);return food;}}
    乌拉拉,来客人啦,来一个剁椒鱼头、笋尖腊肉、猪肉粉条。。。   

import com.pattern.factory.method.FoodFactory;
import com.pattern.factory.method.HuNanFoodFactory;
import com.pattern.factory.method.SiChuanFoodFactory;

public class Test {
public static void main(String[] args){
//第一个菜:剁椒鱼头
FoodFactory f1=new HuNanFoodFactory();
f1.createFood("剁椒鱼头");

//第二个菜:笋尖腊肉
FoodFactory f2=new SiChuanFoodFactory();
f2.createFood("笋尖腊肉");

//第三个菜:猪肉粉条
FoodFactory f3=new DongBeiFoodFactory();
f3.createFood("猪肉粉条");
}
}

通过工厂方法模式的例子可以看到,工厂方法模式有四个要素:

  • 工厂接口:工厂接口是工厂方法模式的核心,与调用者直接交互用来提*品。在实际编程中,有时候也会使用一个抽象类来作为与调用者交互的接口,其本质上是一样的。
  • 工厂实现:工厂实现决定如何实例化产品,是实现扩展的途径,需要有多少种产品,就需要有多少个具体的工厂实现。
  • 产品接口:产品接口的主要目的是定义产品的规范,所有的产品实现都必须遵循产品接口定义的规范。产品接口是调用者最为关心的,产品接口定义的优劣直接决定了调用者代码的稳定性。同样,产品接口也可以用抽象类来代替,但要注意最好不要违反里氏替换原则。
  • 产品实现:实现产品接口的具体类,决定了产品在客户端中的具体行为。

优点:克服了简单工厂模式违背开放-封闭原则的缺点,降低客户端和工厂的耦合性,提高了程序的可扩展性。

缺点:每增加一个产品,相应的也要增加一个子工厂,加大了额外的开发量。