《Head First 设计模式》 学习笔记,码云同步更新中
如有错误或不足之处,请一定指出,谢谢~
目录
查看其它设计模式笔记,点这里→设计模式笔记汇总
简单工厂
- 定义:
- 定义一个类来专门负责创建其他类的实例,被创建的实例通常具有共同的父类。
简单工厂可以根据参数的不同返回一个相应的实例 - 严格来讲,简单工厂模式不属于设计模式,而是属于一种编程习惯
- 定义一个类来专门负责创建其他类的实例,被创建的实例通常具有共同的父类。
- 结构:
- Factory:工厂角色
- Product:抽象产品
- ConcreteProduct:具体产品
- 优点:
- 简单工厂实现了责任的分隔,客户端免除了创建产品对象的责任。
- 客户端无需知道对象创建细节,只需要知道什么参数对应什么对象即可。
- 通过配置文件,可以在不修改客户端代码的情况下更换、增加新的产品类,提高了灵活性。
- 缺点:
- 工厂类集中了所有产品的创建逻辑,一旦无法正常工作,整个系统都会受影响
- 扩展困难。增加修改产品类都需要修改工厂类。如果产品类数量过多,工厂类会很难维护。
- 工厂方法一般都是静态的,工厂无法进行继承。
- 使用环境:
- 工厂类需要创建的对象数量比较少
- 客户端不关心独享创建细节,只知道参数。
- 案例:
- 披萨店。顾客点单时,需要根据菜名创建出各种不同种类的披萨。
这些披萨都源自同一个披萨基类,不过各自有自己的口味实现。
而我们创建具体的披萨对象时,只需要提供名字,不需要知道它们是如何创建的。
这时就可以用到简单工厂,传递一个参数给工厂类,返回一个相应的披萨对象。
- 披萨店。顾客点单时,需要根据菜名创建出各种不同种类的披萨。
- 代码:
/**
* 披萨超类
**/
public interface Pizza {
/**
* 准备
*/
void prepare();
/**
* 烘焙
*/
void bake();
/**
* 切片
*/
void cut();
/**
* 装盒
*/
void box();
}
/**
* 芝士披萨
**/
public class CheesePizza implements Pizza {
@Override
public void prepare() {
}
@Override
public void bake() {
}
@Override
public void cut() {
}
@Override
public void box() {
System.out.println("芝士披萨完成...");
}
}
// 其他披萨略...
/**
* 披萨简单工厂
**/
public class SimplePizzaFactory {
public Pizza createPizza(String type) {
Pizza pizza = null;
if ("cheese".equals(type)) {
pizza = new CheesePizza();
} else if ("veggie".equals(type)) {
pizza = new VeggiePizza();
}
return pizza;
}
}
/**
* 披萨店
**/
public class PizzaStore {
private SimplePizzaFactory pizzaFactory;
public PizzaStore(SimplePizzaFactory pizzaFactory) {
this.pizzaFactory = pizzaFactory;
}
/**
* 点单
**/
public Pizza orderPizza(String type) {
// Pizza pizza = new Pizza(); // 用简单工厂改造
Pizza pizza = pizzaFactory.createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
}
/**
* 测试类
**/
public class Test {
public static void main(String[] args) {
PizzaStore pizzaStore = new PizzaStore(new SimplePizzaFactory());
pizzaStore.orderPizza("cheese");
}
}
结果:
芝士披萨完成...
- 参考资料:
网友评论