05_工厂模式

工厂模式

1.简单工厂:通常另外使用一个类或对象来封装实例化操作。

2.工厂模式:真正的工厂模式则是需要定义一个抽象的工厂方法并把实例化的工作推迟到子类中进行!(接口起着关键性的作用!)

下面以一个简单的例子来说明工厂模式的使用方法:假设你需要开几个Pizza店。每个Pizza店有几种不同类型的Pizza供客人选择。最初的代码可能是下面这样的。

版本1:未使用任何设计模式: 每次加入新种类的pizza,都得修改pizzaStore的代码,尽管它的工作内容并没有改变(pizzaStore只是负责订购pizza,并不负责pizza的创建)。这样显然不合情理。

<script type="text/javascript" src="00_Interface.js"></script>

<script type="text/javascript">

/**

* 定义Pizza接口,每个披萨都具有“准备”,“烘烤”,“装箱”这几个方法

* @type {Interface}

*/

var Pizza = new Interface("Pizza", ["prepare", "bake", "box"]);

/**

* 分别实现三种不同的Pizza类型

* @constructor

*/

function CheesePizza() {

}

CheesePizza.prototype = {

constructor: CheesePizza,

prepare: function () {

//实现prepare方法

}, bake: function () {

//实现bake方法

}, box: function () {

//实现box方法

}

}

function CornPizza() {

}

CornPizza.prototype = {

constructor: CornPizza,

prepare: function () {

//实现prepare方法

}, bake: function () {

//实现bake方法

}, box: function () {

//实现box方法

}

}

function PorkPizza() {

}

PorkPizza.prototype = {

constructor: PorkPizza,

prepare: function () {

//实现prepare方法

}, bake: function () {

//实现bake方法

}, box: function () {

//实现box方法

}

}

/***

* Pizza店的实现类

* @type {{orderPizza: Function}}

*/

var pizzaStore = {

orderPizza: function (type) {

var pizza;

if (type == "cheese") {

pizza = new CheesePizza();

} else if (type == "corn") {

pizza = new CornPizza();

} else if (type == "pork") {

pizza = new PorkPizza();

}

Interface.ensureImplements(pizza, [Pizza]);

pizza.prepare();  //准备

pizza.bake();//烘烤

pizza.box();//装箱

return pizza;

}

}

//var pizza = pizzaStore.orderPizza("cheese");

var pizza = pizzaStore.orderPizza("pork");

alert(pizza.constructor);

</script>

版本2:使用简单工厂:将创建pizza的代码提取到一个简单工厂中去,是这个工厂对象仅仅只是负责pizza的创建这一职责,同时新加入品种也无需再修改pizzaStore类。

1.加入创建pizza的工厂对象

//创建pizza的简单工厂

var PizzaFactory = {

createPizza: function (type) {

var pizza;

if (type == "cheese") {

pizza = new CheesePizza();

} else if (type == "corn") {

pizza = new CornPizza();

} else if (type == "pork") {

pizza = new PorkPizza();

}

Interface.ensureImplements(pizza, [Pizza]);

return pizza;

}

}

2.在pizzaStore中使用这个工厂对象来创建

var pizzaStore = {

orderPizza: function (type) {

var pizza = PizzaFactory.createPizza(type);

pizza.prepare();  //准备

pizza.bake();//烘烤

pizza.box();//装箱

return pizza;

}

}

3.其余部分保持不变

版本3:使用真正的工厂模式:真正的工厂模式与简单工厂的区别在于,它不是另外使用一个对象或类来创建实例,而是使用一个子类。按照正式定义:工厂是一个将其成员对象的实例化延迟到子类中进行的类。

<script type="text/javascript" src="00_Interface.js"></script>

<script type="text/javascript">

/**

* 定义Pizza接口,每个披萨都具有“准备”,“烘烤”,“装箱”这几个方法

* @type {Interface}

*/

var Pizza = new Interface("Pizza", ["prepare", "bake", "box"]);

//假设你的pizza店有2个分店,位于三个不同的地区,分别生产当地口味的pizza

//首先定义一个抽象基类,PizzaStore

var PizzaStore = function () {

};

PizzaStore.prototype = {

constructor: PizzaStore,

orderPizza: function (type) {

var pizza = this.createPizza(type);

pizza.prepare();

pizza.bake();

pizza.box();

return pizza;

}, createPizza: function (type) {

throw new Error("抽象类中未实现该方法,在具体子类中实现!");

}

}

//湖南分店:口味偏辣

function HuNanPizzaStore() {

PizzaStore.call(this, arguments);

}

;

//继承基类

HuNanPizzaStore.prototype = new PizzaStore();

HuNanPizzaStore.prototype.constructor = HuNanPizzaStore;

HuNanPizzaStore.prototype.createPizza = function (type) {

var pizza;

if (type == "greenPepper") {

pizza = new GreenPepperPizza(); //具体Pizza类的实现省略...

} else if (type == "redPepper") {

pizza = new RedPepperPizza();//具体Pizza类的实现省略...

}

Interface.ensureImplements(pizza, [Pizza]);

return pizza;

}

//上海分店,口味偏甜

function ShangHaiPizzaStore() {

PizzaStore.call(this, arguments);

}

ShangHaiPizzaStore.prototype = new PizzaStore();

ShangHaiPizzaStore.prototype = {

constructor: ShangHaiPizzaStore,

createPizza: function (type) {

var pizza;

if (type == "tomato") {

pizza = new TomatoPizza(); //具体Pizza类的实现省略...

} else if (type == "pineapple") {

pizza = new PineapplePizza();//具体Pizza类的实现省略...

}

Interface.ensureImplements(pizza, [Pizza]);

return pizza;

}

}

//使用

var pizzaStore;

pizzaStore = new HuNanPizzaStore();

pizzaStore.orderPizza("greenPepper");   //从湖南分店订购青椒披萨

pizzaStore = new ShangHaiPizzaStore();

pizzaStore.orderPizza("pineapple"); //从上海分店订购凤梨披萨

</script>

使用真正的工厂模式后,想增加其他的分店很简单,只需要增加一个PizzaStore的子类,并实现其createPizza方法即可,不会对其他类造成任何影响!也可以对各个子类进行修改,以增加不同食材的pizza。这是工厂模式最重要的特点。对pizza进行的一般性操作可以放在抽象父类PizzaStore中,而其他具体的实现则放在对应的子类中实现!

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-14 20:28:09

05_工厂模式的相关文章

抽象工厂模式

思考:工厂方法模式:http://www.cnblogs.com/maggiejyt/p/7561253.html 工厂方法模式UML: 问题:如果这家工厂不止要生产Ball(球),还要还有Sneakers(球鞋)等 则UML图为 当Product有多种类时则是抽象工厂模式 代码(Ball的代码见简单工厂模式:http://www.cnblogs.com/maggiejyt/p/7561253.html) Sneakers(球鞋抽象类) package com.maggie.FactoryMet

设计模式 2/23 工厂模式

工厂模式是最常用的设计模式之一,用好了,代码优雅,可维护性高,对系统设计会上一个台阶 为什么这么说,因为工厂模式可以牵扯出抽象工厂模式,也有大家都会聊到的简单工厂模式 我们要了解一点,23中设计模式中,不包含简单工厂模式,之所以大家会去聊这个,四个字,渐进明细 通过对简单工厂模式的了解,我们引入工厂这个词,不然一个写代码的,天天给他讲工厂,工厂,工厂,西厂,东厂,会晕 同时,通过逐步的深入,从简单工厂,到工厂模式,再到抽象工厂,渐进明细的过程,逐步深入的理解,比较优劣,择优而为我们所用. 试想我

简单工厂模式

目前正在看<大话设计模式>,写此系列的文章记录下学习的经过. 简单工厂模式 先看如下代码,使用面向对象的原理实现计算器功能 Operation运算类 1 public class Operation 2 { 3 private double numberA = 0; 4 private double numberB = 0; 5 6 public double NumberA 7 { 8 get { return numberA; } 9 set { numberA = value; } 10

设计模式——介绍与工厂模式(扁平管理模式VS职业经理人模式)

本文主要对设计模式进行大概解说.特别是对工厂模式进行简明的解析: 一.设计模式的分类 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.訪问者模式.中介者模式.解释器模式. 事实上还有两类:并发型模式和线程池模式. 二.设计模式的六大原则 1.开闭原则(Op

工厂模式

工厂模式属于创建型模式,由一个工厂对象决定创建出哪一种产品类的实例. 角色: IProduct: 产品共同的接口 Product1:具体的产品类 Creator:工厂类,可根据参数决定创建的产品类型 示例: public interface IProduct { void myfunction(); } --- class Product1 implements IProduct{ public void myfunction(){ System.out.println("function1&q

Java设计模式—工厂方法模式&amp;抽象工厂模式

工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式.       工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 通用类图如下: 在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义:Creator为抽象创建 类,也就是抽象工厂,具体如何创建产品类是由具体的实现工厂ConcreteCreator完成的. 工厂方法模式的扩展方式有很多种,下边是工厂方法模式一个比较实用的源代码: 抽象产品类: pub

java设计模式--工厂模式

总结 (1)简单工厂模式是由一个具体的类去创建其他类的实例,父类是相同的,父类是具体的. (2)工厂方法模式是有一个抽象的父类定义公共接口,子类负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成. (3)抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类.它针对的是有多个产品的等级结构.而工厂方法模式针对的是一个产品的等级结构. 一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java

大话设计模式:简单工厂模式

由于面向过程编程造成的代码膨胀问题越来越严重,使其维护的代价高,灵活性很低.为了使代码易维护.易扩展.易复用和灵活性好,所以我们在采用面向对象编程的时候,防止采用面向对象的语言实际上却做着面向过程的事儿,更需要采用某种设计模式,核心就是使程序变得高内聚,低耦合,这样的程序才能达到上面的四个优点.而简单工厂模式的出现也正是为了达到这样一种效果,将工厂和产品分块,具体解决了实例化那个对象(具体产品)的需求.从而实现了高内聚,低耦合.使程序易维护.易扩展.易复用和灵活性好.同时也用到了面向对象编程的三

大话设计模式:抽象工厂模式

抽象方法模式:提供一个创建一系列相关或互相依赖对象的接口,而无需指定他们具体的类. 三种模式的对比:   简单工厂模式 工厂模式 抽象工厂模式 产品 可以有多个但是都属于同一类, 同一等级.都继承产品抽象类. 可以有多个但是都属于同一类,同一等级. 都继承产品抽象类. 可以有不同种类的产品,每类有多中 具体产品: 抽象产品 只能有一个 只能有一个; 多个抽象产品类:每个抽象产品类可 以派生多种具体产品: 抽象工厂类   只能有一个,可以派生出多个具体工厂类: 只有一个,可派生出多个具体工厂类: