Java设计模式-简单工厂
简述
举例:生产不同口味Pizza
优缺点
优点
- 创建对象方便。根据关键字(比如一个字符串)就可以创建一个对象
- 扩展性高。增加一个具体类即增加一个产品
- 封装性。屏蔽产品实现
缺点
- 每增加一个产品,都需要增加一个具体类和修改工厂工厂,类数不断增加,在一定程度上增加了系统的复杂度
代码
Pizza
package com.ydfind.gof.factory;
/**
* 制作pizza 接口
* @author ydfind
* @date 2019.10.14
*/
public interface Pizza {
/**
* 准备
*/
void prepare();
/**
* 烘烤
*/
void bake();
/**
* 切片
*/
void cut();
/**
* 装盒
*/
void box();
}
CheesePizza
package com.ydfind.gof.factory;
/**
* 奶酪Pizza
* @author ydfind
* @date 2019.10.14
*/
public class CheesePizza implements Pizza {
@Override
public void prepare() {
System.out.println("这是一个奶酪Pizza");
}
@Override
public void bake() {
}
@Override
public void cut() {
}
@Override
public void box() {
}
}
VeggiePizza
package com.ydfind.gof.factory;
/**
* 素食Pizza
* @author ydfind
* @date 2019.10.14
*/
public class VeggiePizza implements Pizza {
@Override
public void prepare() {
System.out.println("这是一个素食Pizza");
}
@Override
public void bake() {
}
@Override
public void cut() {
}
@Override
public void box() {
}
}
SimplePizzaFactory
package com.ydfind.gof.factory;
/**
* 简单Pizza工厂
* @author ydfind
* @date 2019.10.14
*/
public class SimplePizzaFactory {
public static final String CHEESE_PIZZA = "奶酪Pizza";
public static final String VEGGIE_PIZZA = "素食Pizza";
/*******************************静态工厂,缺点:无法通过继承来修改创建行为************************************/
/**
* 根据关键字创建对象
*/
public static Pizza createPizza(String type){
switch (type){
case CHEESE_PIZZA:
return new CheesePizza();
case VEGGIE_PIZZA:
return new VeggiePizza();
default:
return null;
}
}
}
使用示例
PizzaStore
package com.ydfind.gof.factory;
/**
* Pizza店
* @author ydfind
* @date 2019.10.25
*/
public class PizzaStore {
public Pizza orderPizza(String type){
Pizza pizza;
pizza = SimplePizzaFactory.createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
}
测试
/**
* 简单工厂模式 测试:Pizza.java、CheesePizza.java、VeggiePizza.java、SimplePizzaFactory.java
*/
@Test
public void testSimpleFactory(){
System.out.println("*********************简单工厂 测试********************************");
PizzaStore pizzaStore = new PizzaStore();
// pizza店制作两个pizza
pizzaStore.orderPizza(SimplePizzaFactory.CHEESE_PIZZA);
pizzaStore.orderPizza(SimplePizzaFactory.VEGGIE_PIZZA);
}