设计模式学习笔记:工厂模式
Posted 滴滴哒滴哒
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式学习笔记:工厂模式相关的知识,希望对你有一定的参考价值。
工厂模式是一种很常见的设计模式,主要讨论的问题在于类的实例化。每当我们应用的时候,我们总要去new(实例化)一个对象。这是一个必须也很常见的过程,但是当我们要增加新的具体类型,就必须改变原有代码。这给我们的扩展造成巨大的不便。
如何改变这种情况呢?这时候就要用到工厂模式了。
工厂模式定义了一个创建对象的接口,但是由子类决定要实例化的是哪一个。工厂方法让类把实例化推迟到子类进行。通过这种模式,我们不用具体去管工厂里“产品”具体是怎样制作的。实现了“解耦”。
但是缺点就是:每当我新增一类的产品,我们都需要去增加一个工厂和产品,这样我们系统的类的数量会成倍增加,系统复杂度上升,同时也增加了系统具体类的依赖。需要我们酌情使用。
简单工厂模式
简单工厂模式并算不上一种“设计模式”,但也算一种比较常见的使用方案。简单工厂模式只是将对象的创建封装起来,并不具备工厂方法的弹性。
在这里我们拿一个PizzaStore来做例子。
public class PizzaStore
public Pizza orderPizza(String type)
//实例化Pizza类,可变的
Pizza pizza = null;
if (type.equals("cheese"))
pizza = new CheesePizza();
else if (type.equals("greek"))
pizza = new GreekPizza();
else if (type.equals("pepperoni"))
pizza = new PepperoniPizza();
//Pizza固定制作流程
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
面对生产多种Pizza种类的工厂,我们初期的想法可能就像上面一样,把Pizza类的实例化放在代码中,但是这样的代码并未对修改进行封闭,一旦我们需要加入新的Pizza种类,就必须要改动原有代码(这种做法是不安全的,改动现有的代码可能会有Bug产生的风险,对于其他关联的模块可能会造成不可预估的影响)。我们首先把可能发生变化的部分与不会发生变化的部分进行分离。
public class SimplePizzaFactory
public Pizza createPizza(String type)
Pizza pizza = null;
if (type.equals("cheese"))
pizza = new CheesePizza();
else if (type.equals("greek"))
pizza = new GreekPizza();
else if (type.equals("pepperoni"))
pizza = new PepperoniPizza();
return pizza;
public class PizzaStore
SimplePizzaFactory factory;
//PizzaStore的构造器将SimplePizzaFactory作为参数
public PizzaStore(SimplePizzaFactory factory)
this.factory = factory;
public Pizza orderPizza(String type)
Pizza pizza = null;
//我们将new变化成了工厂的方法
pizza = factory.createPizza(type);
//Pizza固定制作流程
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
我们简单的把原有PizzaStore里的可变部分(实例化部分)和固定部分进行了分离,这样就构成了一个简单工厂。这个方案下,我们至少把实例部分从我们业务逻辑部分分离。但是这里的factory是一个具体的类,业务扩展的时候还是要去对factory模块进行修改,可以预见的是这种方法缺乏弹性。
以上是关于设计模式学习笔记:工厂模式的主要内容,如果未能解决你的问题,请参考以下文章
java/android 设计模式学习笔记---工厂方法模式