- 工厂方法模式原理介绍:
- 工厂方法模式适用举例
- 工厂方法模式代码实现
- 原理介绍:工厂方法模式(FACTORY METHOD)是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品.
- 适用情景举例:在前文所讲的简单工厂模式中,我们把生产产品的操作分离出来形成一个工厂类,这种情况只适用于一个工厂的情景,如果都多个工厂,比如武汉一个,长沙一个,适用简单工厂模式的话我们就需要在武汉和长沙的工厂各运行一套代码,这样比利于代码的维护。所以我们把工厂抽象出一个超类,各地的工厂分别实现这个类,这样就可以很好的维护代码.
- 工厂方法模式的具体实现:
把生产披萨的方法抽象出来,各个工厂实现这个方法:
package moshi.gunanyi.com.工厂方法模式;
import java.util.Scanner;
import moshi.gunanyi.com.简单工厂模式.pizza.Pizza;
/**
* 工厂方法模式,适用于有多个地方生产披萨
* @author Administrator
*
*/
public abstract class OrderPizza {
Pizza pizza = null;
String orderType;
public void getOrder() {
do {
orderType = getType();
pizza = createPizza(orderType);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}while(true);
}
//生产披萨方法抽象
public abstract Pizza createPizza(String orderType);
private String getType() {
Scanner sca = new Scanner(System.in);
System.out.println("请输入披萨类型:");
String str = sca.next();
return str;
}
}
- 武汉工厂继承超类,实现抽象方法
package moshi.gunanyi.com.工厂方法模式;
import moshi.gunanyi.com.简单工厂模式.pizza.Pizza;
import moshi.gunanyi.com.简单工厂模式.pizza.WuHanCheesePizza;
import moshi.gunanyi.com.简单工厂模式.pizza.WuHanGreekPizza;
public class WuHanOrderPizza extends OrderPizza {
@Override
public Pizza createPizza(String orderType) {
Pizza pizza=null;
if(orderType.equals("cheese")) {
pizza = new WuHanCheesePizza();
}else if(orderType.equals("greek")) {
pizza = new WuHanGreekPizza();
}
return pizza;
}
}
披萨的实现也是继承自超类(pizza超类参考简单工厂模式):
package moshi.gunanyi.com.简单工厂模式.pizza;
/**
* 武汉生产的披萨
* @author Administrator
*
*/
public class WuHanCheesePizza extends Pizza {
@Override
public void prepare() {
super.setName("WuHanCheesePizza");
System.out.println(name+" preparing");
}
}
package moshi.gunanyi.com.简单工厂模式.pizza;
/**
* 武汉厂商的披萨
* @author Administrator
*
*/
public class WuHanGreekPizza extends Pizza {
@Override
public void prepare() {
super.setName("WuHanGreekPizza");
System.out.println(name+" preparing");
}
}
- 结果测试:
package moshi.gunanyi.com.工厂方法模式;
public class Test {
public static void main(String[] args) {
OrderPizza wuHanOrderPizza = new WuHanOrderPizza();
wuHanOrderPizza.getOrder();
}
}
运行结果: