简单工厂模式 Simple Method Pattern
·
一、模式介绍
1.1、定义
简单工厂模式不属于23中设计模式,它的缺点是增加新产品时会违背开闭原则。简单工厂一般分为:普通简单工厂、多方法简单工厂、静态方法简单工厂。
简单工厂模式是有一个具体的工厂类,可以生成多个不同的产品,属于创建型设计模式。其创建实例的方法通常为静态方法,因此简单工厂模式(Simple Factory Pattern)又称为静态工厂方法模式(Static Factory Method Pattern)。
工厂方法模式是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则。
1.2、优点
- 工厂类包含必要的逻辑判断,根据条件创建具体的产品实例。客户端可以通过工厂很方便的创建出相应的产品,省去自己直接创建实例的操作。工厂和产品的职责区分明确
- 客户端无需知道所创建具体产品的类名,只需要知道参数即可
1.3、缺点
- 简单工厂模式的工厂类单一,负责所有产品的创建,职责过重,一旦异常,整个系统将受到影响。且工厂类代码会非常臃肿,违背高聚合原则
- 使用简单工厂模式会增加系统中类的个数(引入新的工厂类),增加系统的复杂度和理解难度
- 系统扩展困难,一旦增加新产品,不得不修改工厂逻辑;在产品类型较多的情况,可能造成逻辑过于复杂
- 简单工厂模式使用静态工厂方法,造成工厂角色无法形成基于继承的等级结构
二、模式的结构与实现
2.1、结构
简单工厂模式的主要角色如下:
- 简单工厂 SimpleFactory:负责实现创建所有实例的内部逻辑。被客户端可以直接调用工厂中创建产品实例的方法,创建所需的产品对象
- 抽象产品 Product:是简单工厂创建的所有对象的父类,负责描述所有实例共有的公共接口
- 具体产品 ConcreteProduct:是简单工厂模式的创建具体目标对象
其结构如下图所示。

2.2、代码实现
2.2.1、类图

2.2.2、CheesePizza
package com.yj.factory.simple.concrete;
import com.yj.factory.Pizza;
/**
* 奶酪披萨
*/
public class CheesePizza extends Pizza {
public CheesePizza() {
toppings.add("cheese");
}
}
2.2.3、ClamPizza
package com.yj.factory.simple.concrete;
import com.yj.factory.Pizza;
/**
* 蛤蜊披萨
*/
public class ClamPizza extends Pizza {
public ClamPizza() {
name = "clam pizza";
toppings.add("clam");
}
}
2.2.4、PepperoniPizza
package com.yj.factory.simple.concrete;
import com.yj.factory.Pizza;
/**
* 意大利香肠披萨
*/
public class PepperoniPizza extends Pizza {
public PepperoniPizza() {
name = "pepperoni pizza";
toppings.add("pepperoni");
}
}
2.2.5、VeggiePizza
package com.yj.factory.simple.concrete;
import com.yj.factory.Pizza;
/**
* 蔬菜披萨
*/
public class VeggiePizza extends Pizza {
public VeggiePizza(){
name = "veggie pizza";
toppings.add("veggie");
}
}
2.2.6、SimplePizzaFactory
package com.yj.factory.simple;
import com.yj.factory.Pizza;
import com.yj.factory.simple.concrete.CheesePizza;
import com.yj.factory.simple.concrete.ClamPizza;
import com.yj.factory.simple.concrete.PepperoniPizza;
import com.yj.factory.simple.concrete.VeggiePizza;
/**
* 只做一件事,帮客户创建Pizza 对象
*/
public class SimplePizzaFactory {
// ------------------ 普通方法 start ------------------
/**
* 生成Pizza 实例
* @param type
* @return
*/
public static Pizza createPizza(String type) {
Pizza pizza = null;
if (type == null || type.equals("")) {
return pizza;
}
if (type.equals("cheese")) {
pizza = new CheesePizza();
} else if (type.equals("pepperoni")) {
pizza = new PepperoniPizza();
} else if (type.equals("clam")) {
pizza = new ClamPizza();
} else if (type.equals("veggie")) {
pizza = new VeggiePizza();
}
return pizza;
}
// ------------------ 普通方法 end ------------------
// ------------------ 多个方法 start ------------------
public Pizza createCheese() {
return new CheesePizza();
}
public Pizza createPepperoni() {
return new PepperoniPizza();
}
// ------------------ 多个方法 end ------------------
// ------------------ 多个静态方法 start ------------------
public static Pizza createClam() {
return new ClamPizza();
}
public static Pizza createVeggie() {
return new VeggiePizza();
}
// ------------------ 多个静态方法 end ------------------
}
2.2.7、PizzaStore
package com.yj.factory.simple;
import com.yj.factory.Pizza;
public class PizzaStore {
public Pizza orderPizza(String type) {
Pizza pizza;
pizza = SimplePizzaFactory.createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
}
2.2.8、PizzaTestDrive
package com.yj.factory.simple.test;
import com.yj.factory.simple.PizzaStore;
public class PizzaTestDrive {
public static void main(String[] args) {
PizzaStore pizzaStore = new PizzaStore();
pizzaStore.orderPizza("cheese");
System.out.println("-------------------------");
pizzaStore.orderPizza("clam");
System.out.println("-------------------------");
pizzaStore.orderPizza("pepperoni");
System.out.println("-------------------------");
pizzaStore.orderPizza("veggie");
}
}
2.2.9、运行结果
Preparing cheese pizza
Tossing dough ...
Adding sauce ...
Adding toppings:
cheese
350度烘烤25分钟
把披萨切成对角
把披萨放在官方的披萨盒里
-------------------------
Preparing clam pizza
Tossing dough ...
Adding sauce ...
Adding toppings:
clam
350度烘烤25分钟
把披萨切成对角
把披萨放在官方的披萨盒里
-------------------------
Preparing pepperoni pizza
Tossing dough ...
Adding sauce ...
Adding toppings:
pepperoni
350度烘烤25分钟
把披萨切成对角
把披萨放在官方的披萨盒里
-------------------------
Preparing veggie pizza
Tossing dough ...
Adding sauce ...
Adding toppings:
veggie
350度烘烤25分钟
把披萨切成对角
把披萨放在官方的披萨盒里
更多推荐


所有评论(0)