定义:定义一个工厂类,它可以根据参数的不同返回不同类型的实例,被创建的实例通常有公共的父类。
模式类型:创建型模型
Factory(工厂角色):即工厂类,负责实现创建所有产品实例的内部逻辑;工厂类可以直接被外界调用,创建所需的产品对象;在工厂类中提供了静态的工厂方法FactoryMethod(),它的返回类型为抽象产品Product。
Product(抽象产品角色):它是工厂类所创建的所有对象的父类,封装了各种产品对象的公共方法。提高了系统的灵活性,使得工厂类只需定义一个通用的工厂方法,因为所有创建的具体产品对象都是其子类对象。
ConcreteProduct(具体产品角色):所有被创建的对象都充当某个具体类的实例。每一个具体产品角色都继承了抽象产品角色,需要实现在抽象产品中声明的抽象方法。
案例:pizza生产简单工厂模式
1 /**
2 * @author EASON
3 * @date 2017.1.7 13:23
4 * @function 工厂模式
5 */
6 package com.nju;
7
8 import java.io.BufferedReader;
9 import java.io.IOException;
10 import java.io.InputStreamReader;
11
12 public class Test {
13 public static void main(String[] args) {
14 PizzaStore ps = new PizzaStore();
15 ps.orderPizza();
16 }
17 }
18
19 //抽象产品类
20 interface Pizza{
21 public void prepare();
22 public void bake();
23 public void cut();
24 public void packaged();
25 }
26
27 //具体产品类-奶酪披萨
28 class CheesePizza implements Pizza{
29 //具体产品类需要实现抽象产品类中的方法
30 public void prepare() {
31 System.out.println("奶酪披萨开始制作...");
32 }
33
34 public void bake() {
35 System.out.println("奶酪披萨开始烘焙...");
36 }
37
38 public void cut() {
39 System.out.println("奶酪披萨开始切块...");
40 }
41
42 public void packaged() {
43 System.out.println("奶酪披萨包装完毕...");
44 }
45
46 }
47
48 //具体产品类-洋葱披萨
49 class PepperoniPizza implements Pizza{
50
51 public void prepare() {
52 System.out.println("洋葱披萨开始制作...");
53 }
54
55 public void bake() {
56 System.out.println("洋葱披萨开始烘焙...");
57 }
58
59 public void cut() {
60 System.out.println("洋葱披萨开始切块...");
61 }
62
63 public void packaged() {
64 System.out.println("洋葱披萨包装完毕...");
65 }
66
67 }
68
69 //Pizza工厂类
70 class PizzaFactory{
71 public Pizza getPizza(String pizzaType){
72 switch(pizzaType){
73 case("cheesePizza"):
74 return new CheesePizza();
75 case("pepperonPizza"):
76 return new PepperoniPizza();
77 default:
78 return null;
79 }
80 }
81 }
82
83 //Pizza商店类
84 class PizzaStore{
85 public void orderPizza(){
86 BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
87 PizzaFactory pf = new PizzaFactory();
88 System.out.println("欢迎光临!");
89 System.out.println("请输入你想要购买的Pizza:");
90 try {
91 String pizzaType = bf.readLine();
92 Pizza pizza = pf.getPizza(pizzaType);
93 pizza.prepare();
94 pizza.bake();
95 pizza.cut();
96 pizza.packaged();
97 System.out.println("欢迎下次光临!");
98 } catch (IOException e) {
99 e.printStackTrace();
100 }
101 }
102 }
使用简单工厂模式的好处,可以把复杂的逻辑判断代码从PizzaStore中分离出来,即便需要修改判断逻辑,也不会影响PizzaStore,符合OCP。