定义:定义一个工厂类,它可以根据参数的不同返回不同类型的实例,被创建的实例通常有公共的父类。
模式类型:创建型模型
Factory(工厂角色):即工厂类,负责实现创建所有产品实例的内部逻辑;工厂类可以直接被外界调用,创建所需的产品对象;在工厂类中提供了静态的工厂方法FactoryMethod(),它的返回类型为抽象产品Product。
Product(抽象产品角色):它是工厂类所创建的所有对象的父类,封装了各种产品对象的公共方法。提高了系统的灵活性,使得工厂类只需定义一个通用的工厂方法,因为所有创建的具体产品对象都是其子类对象。
ConcreteProduct(具体产品角色):所有被创建的对象都充当某个具体类的实例。每一个具体产品角色都继承了抽象产品角色,需要实现在抽象产品中声明的抽象方法。
案例:pizza生产简单工厂模式
/**
* @author EASON
* @date 2017.1.7 13:23
* @function 工厂模式
*/
package com.nju; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader; public class Test {
public static void main(String[] args) {
PizzaStore ps = new PizzaStore();
ps.orderPizza();
}
} //抽象产品类
interface Pizza{
public void prepare();
public void bake();
public void cut();
public void packaged();
} //具体产品类-奶酪披萨
class CheesePizza implements Pizza{
//具体产品类需要实现抽象产品类中的方法
public void prepare() {
System.out.println("奶酪披萨开始制作...");
} public void bake() {
System.out.println("奶酪披萨开始烘焙...");
} public void cut() {
System.out.println("奶酪披萨开始切块...");
} public void packaged() {
System.out.println("奶酪披萨包装完毕...");
} } //具体产品类-洋葱披萨
class PepperoniPizza implements Pizza{ public void prepare() {
System.out.println("洋葱披萨开始制作...");
} public void bake() {
System.out.println("洋葱披萨开始烘焙...");
} public void cut() {
System.out.println("洋葱披萨开始切块...");
} public void packaged() {
System.out.println("洋葱披萨包装完毕...");
} } //Pizza工厂类
class PizzaFactory{
public Pizza getPizza(String pizzaType){
switch(pizzaType){
case("cheesePizza"):
return new CheesePizza();
case("pepperonPizza"):
return new PepperoniPizza();
default:
return null;
}
}
} //Pizza商店类
class PizzaStore{
public void orderPizza(){
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
PizzaFactory pf = new PizzaFactory();
System.out.println("欢迎光临!");
System.out.println("请输入你想要购买的Pizza:");
try {
String pizzaType = bf.readLine();
Pizza pizza = pf.getPizza(pizzaType);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.packaged();
System.out.println("欢迎下次光临!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用简单工厂模式的好处,可以把复杂的逻辑判断代码从PizzaStore中分离出来,即便需要修改判断逻辑,也不会影响PizzaStore,符合OCP。