工厂模式一之简单工厂

工厂用来生产商品,然后卖给供应商,再由供应商转手给门店,再卖给顾客 。这样的一种生产到供应的过程,看看如何应用到我们的程序中。

1.下面以衣服店为例子。

第一步

clothes.js

//创建一个衣服店模型。
var ClothesShop = function (){}
ClothesShop.prototype = {
    sellClothes: function (color){
        var clothesType = [‘Red‘, ‘Blue‘, ‘Yello‘, ‘Green‘, ‘Gray‘];
        var clothes;
        for(var i = 0, len = clothesType.length; i < len; i++) {
            if(color === clothesType[i]){
                clothes = eval(‘new ‘+ color);   //new Red();
            }
        }
        //判断制造的是不是衣服。
        Interface.ensureImplements(clothes, Clothes);
        //出售
        return clothes;
    }
}
/*门店1
var clothesShop1 = new ClothesShop();
门店2
var clothesShop2 = new ClothesShop();
门店3
var clothesShop3 = new ClothesShop();*/

创建一个门店模型。按照这个模型来实例化门店对象,可以创建多个门店clothesShop1,clothesShop2, clothesShop3..每个门店都可以卖各种漂亮颜色红蓝黄绿灰的衣服。type是顾客喜好的颜色,顾客喜欢就买走。哈哈Interface.ensureImplements在鸭式辨型中提过。这里用来检测衣服是否实现了衣服接口(检测商品到底合不合格)。

Interface类

var Interface = function (name, methods) {
    if(!methods) {
        throw new Error(‘Methods is undefined.‘);
    }
    if(!Array.isArray(methods)) {
        throw new Error(‘Methods is not an array.‘);
    }
    this.name = name;
    this.methods = [];
    //自定义方法作为类的依据
    for(var i = 0, len = methods.length; i < len; i++) {
        var method = methods[i];
        if(typeof method !== ‘string‘) {
            throw new Error(‘Method name expected to be a string.‘);
            break;
        }
        this.methods.push(method);
    }
}

ensureImplements方法

Interface.ensureImplements = function () {
    var canFoundMethods = [];
    if(arguments.length < 2) {
        throw new Error(‘Arguments is expected at least 2.‘);
    }
    //取第二个参数("鸭子"的实例),称为参照对象
    for(var i = 1, len = arguments.length; i < len; i++) {
        var interface = arguments[i];
        //遍历参照对象的方法名称,对比检测对象。
        for(var j = 0, methodsLength = interface.methods.length; j < methodsLength; j++) {
            var method = interface.methods[j];
            if(!arguments[0][method] || typeof arguments[0][method] !== ‘function‘) {
                //检测对象没有的方法名称则记录
                canFoundMethods.push(method);
            }
        }
    }
    //最后输出没有的方法
    if(canFoundMethods.length) {
        throw new Error (‘Method ‘ + canFoundMethods.join(‘,‘) + ‘ was not found.‘);
    }
}

第二步

//衣服接口。衣服是什么?自定义为衣服制造出来的,可以穿,可以洗,可以晒干的。
var Clothes = new Interface(‘Clothes‘, [‘make‘, ‘ware‘, ‘wash‘, ‘dry‘]);

定义一个衣服接口,并且自定义具有这四个特点的就是衣服。接口就是一个规则,用来检测对象具有某些方法的手段。

//定义红色衣服的模型。
var Red = function (){};
Red.prototype = {
    color: function (){return ‘Red‘;},
    make: function (){},
    ware: function (){},
    wash: function (){},
    dry: function (){}
}

定义衣服模型。按照这个模型可以生产很多红色的衣服

clothes = eval(‘new ‘+ color);

但是这里还需要经过接口类方法的检测,有没有实现衣服接口。

Interface.ensureImplements(clothes, Clothes);

第三步

//按照衣服门面店的模型,创建一个衣服店。当然也可以创建N个店,clothesShop1,clothesShop2...
var clothesShop = new ClothesShop();
//指定你要的选的颜色,买新的衣服
var yourNewClothes = clothesShop.sellClothes(‘Red‘);

当clothesShop调用sellClothes方法时,就像顾客下订单,然后由店来生产衣服,检测,最后出售。简单的工厂模式完成了,可以高兴一下。但是还是存在着一点问题,这里存在clothesShop既是门店,也是生产衣服的工厂。明显不符合我们的逻辑。我们肯定想的是把工厂和门店要分开。



第四步

//===============工厂制造衣服==================

//把制造工作交给工厂,商店只负责出售衣服,分工明确。
var clothesFactory = {
    createClothes: function (color) {
        var clothesType = [‘Red‘, ‘Blue‘, ‘Yello‘, ‘Green‘, ‘Gray‘];
        var clothes;
        for(var i = 0, len = clothesType.length; i < len; i++) {
            if(color === clothesType[i]){
                clothes = eval(‘new ‘+ color);   //new Red();
            }
        }
        //判断制造的是不是衣服。
        Interface.ensureImplements(clothes, Clothes);
        //衣服出厂
        return clothes;
    }
}

用一个工厂对象来实现createClothes方法。

第五步

//创建一个衣服门店模型。
var ClothesShop = function (){}
ClothesShop.prototype = {
    sellClothes: function (color){
        var clothes = clothesFactory.createClothes(color);
        //出售
        return clothes;
    }
}

修改ClothesShop门店模型,只负责出售衣服。到这里简单工厂完成了。

完整代码:

clothes.js

  1 /**
  2  * Created by Song_yc on 2015/2/2.
  3  */
  4 //创建一个衣服门面店模型。
  5 var ClothesShop = function (){}
  6 ClothesShop.prototype = {
  7     sellClothes: function (color){
  8         var clothes = clothesFactory.createClothes(color);
  9         //出售
 10         return clothes;
 11     }
 12 }
 13 /*门店1
 14 var clothesShop1 = new ClothesShop();
 15 门店2
 16 var clothesShop2 = new ClothesShop();
 17 门店3
 18 var clothesShop3 = new ClothesShop();*/
 19
 20 var Interface = function (name, methods) {
 21     if(arguments.length !== 2) {
 22         throw new Error(‘Interface constructor called with‘ + arguments.length + ‘arguments, but expected exactly 2.‘);
 23     }
 24     this.name = name;
 25     this.methods = [];
 26     if(!Array.isArray(methods)) {
 27         throw new Error(‘The second argument is expected array object instance of ‘ + typeof method+ ‘.‘);
 28     }
 29     for(var i = 0, len = methods.length; i < len; i++) {
 30         var method = methods[i];
 31         if(typeof method !== ‘string‘) {
 32             throw new Error(‘Interface constructor expects method names to be as a string.‘);
 33             break;
 34         }
 35         this.methods.push(method);
 36     }
 37 }
 38
 39 Interface.ensureImplements = function () {
 40     var canFoundMethods = [];
 41     //First to determine argument‘s length.
 42     if(arguments.length < 2) {
 43         throw new Error(‘Arguments is expected at least 2.‘);
 44     }
 45     //Second to determine instance class.
 46     for(var i = 1, len = arguments.length; i < len; i++) {
 47         var interface = arguments[i];
 48         if(interface.constructor !== Interface) {
 49             throw new Error(interface.name + ‘object is not instanced of Interface Class.‘);
 50         }
 51         for(var j = 0, methodsLength = interface.methods.length; j < methodsLength; j++) {
 52             var method = interface.methods[j];
 53             if(!arguments[0][method] || typeof arguments[0][method] !== ‘function‘) {
 54                 //throw new Error(‘Method ‘ + method + ‘was not found.‘);
 55                 canFoundMethods.push(method);
 56             }
 57         }
 58     }
 59     //canFoundMethods.forEach(function (methodName) {
 60     //    throw new Error(‘Method ‘ + methodName + ‘was not found.‘);
 61     //})
 62     if(canFoundMethods.length) {
 63         throw new Error (‘Method ‘ + canFoundMethods.join(‘,‘) + ‘ was not found.‘);
 64     }
 65 }
 66 //定义衣服类。衣服是什么?被制造出来的,可以穿,可以洗,可以晒干的。
 67 var Clothes = new Interface(‘Clothes‘, [‘make‘, ‘ware‘, ‘wash‘, ‘dry‘]);
 68 //定义红色衣服的模型。
 69 var Red = function (){};
 70 Red.prototype = {
 71     color: function (){return ‘red‘;},
 72     make: function (){},
 73     ware: function (){},
 74     wash: function (){},
 75     dry: function (){}
 76 }
 77
 78 //===============工厂制造衣服==================
 79
 80 //把制造工作交给工厂,商店只负责出售衣服,分工明确。
 81 var clothesFactory = {
 82     createClothes: function (color) {
 83         var clothesType = [‘Red‘, ‘Blue‘, ‘Yello‘, ‘Green‘, ‘Gray‘];
 84         var clothes;
 85         for(var i = 0, len = clothesType.length; i < len; i++) {
 86             if(color === clothesType[i]){
 87                 clothes = eval(‘new ‘+ color);   //new Red();
 88             }
 89         }
 90         //判断制造的是不是衣服。
 91         Interface.ensureImplements(clothes, Clothes);
 92         //衣服出厂
 93         return clothes;
 94     }
 95 }
 96
 97 //按照衣服门面店的模型,创建一个衣服店。当然也可以创建N个店,clothes1,clothes2...
 98 var clothesShop = new ClothesShop();
 99 //选择喜欢的颜色
100 var yourNewClothes = clothesShop.sellClothes(‘Red‘);

index.html

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<script src="Interface类.js"></script>
<script src="Interface.ensureImplements方法.js"></script>
<script src="衣服店.js"></script>
</body>
</html>

最后看看新的衣服。

2.总结:

回顾一下:首先创建一个门店模型,拥有生产各色衣服的方法。然后定义衣服接口,创建红色衣服模型,通过接口检测衣服是否合格。实例化门店,门店按照顾客的喜好进行生产衣服,检测,出售。最后把门店生产独立设计成简单工厂,生产和门店分离。

  • 简单工厂方法就是把创建类实例的方法放在外部对象,当实例化对象时在外部对象中进行。
时间: 2024-12-23 00:42:52

工厂模式一之简单工厂的相关文章

工厂模式总结(简单工厂,工厂方法,抽象工厂)

工厂模式属于创建型模式,大致可以分为三类,简单工厂模式.工厂方法模式.抽象工厂模式. 通过两个例子讲解这三种工厂模式 示例一 简单工厂模式 首先介绍简单工厂模式,它的主要特点是需要在工厂类中做判断,从而创造相应的产品.当增加新的产品时,就需要修改工厂类.有点抽象,举个例子就明白了.有一家生产处理器核的厂家,它只有一个工厂,能够生产两种型号的处理器核.客户需要什么样的处理器核,一定要显示地告诉生产工厂.下面给出一种实现方案. 1 enum CTYPE {COREA, COREB}; 2 class

工厂模式三部曲之简单工厂模式

今天,我们来谈一谈工厂模式三部曲之一——简单工厂模式(静态工厂模式).首先,先谈一下工厂模式吧,工厂模式根据抽象程度的不同划分为三种:简单工厂模式,工厂方法模式以及抽象工厂模式.它是编程中经常用到的一种模式哦.那么为什么这么受欢迎呢?1.可以使代码清晰,有效地封装变化.通过工厂模式将产品的实例化封装起来,调用者无需关心产品的实例化过程,只需要依赖工厂即可得到自己想要的产品.2.降低耦合度.产品类的实例化通常需要依赖很多的类,而这些类对于调用者来说根本无需知道,使用了工厂方法,我们需要做的仅仅是实

《JAVA与模式》之简单工厂模式 (转)

在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例. 那么简单工厂模式是在什么场景下使用呢,下面就以本人的理解举例说明: 就拿登录功能来说,假如应用系统需要支持多种登录方式如:口令认证.域认证(口令认证通常是去数据库中验证用户,而域认证则是需要到微软的域中验证用户).那么自然的做法就是建立一个各种登录方式都适用的接口,如下图所

《JAVA与模式》之简单工厂模式

在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例. 那么简单工厂模式是在什么场景下使用呢,下面就以本人的理解举例说明: 就拿登录功能来说,假如应用系统需要支持多种登录方式如:口令认证.域认证(口令认证通常是去数据库中验证用户,而域认证则是需要到微软的域中验证用户).那么自然的做法就是建立一个各种登录方式都适用的接口,如下图所

工厂模式三部曲:抽象工厂模式

工厂模式三部曲:简单工厂模式 工厂模式三部曲:工厂方法模式 前言 这是工厂模式三部曲中的最后一篇了,在这篇文章中将会讲述抽象工厂模式,抽象工厂模式正如其名字一样,非常抽象.但是抽象工厂模式的功能却十分强大,对抽象工厂的利用也非常好. 这篇文章中会像本系列第一篇一样,给出普通实现方式和使用了反射机制的实现两种代码,并且会说明这两种实现方式的区别.并且在文章的最后,会将这三种模式放在一起,对这三种工厂模式进行总结. 本人理解可能不够深刻,这一系列文章中存在的问题,欢迎大家提出,谢谢! 什么是抽象工厂

创建型模式1.2简单工厂模式

一.概念 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一. 二.类图 三.具体介绍 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例. 该模式中包含的角色及其职责 工厂(OpertionFactory)角色 简单工厂模式的核心,它负责实现创建所有实例的内部逻辑.工厂

工厂模式原理及其简单应用

我的理解:用工厂方法代替new操作的一种模式.工厂方法封装了多个相关联类的new方法,每次实例化这些类的时候不需要new多次,只需要调用工厂类的对应方法即可实例化这些类. 结合简单示例和UML图,讲解工厂模式简单原理. 一.引子话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰).Bmw(宝马).Audi(奥迪)看来这人比较爱国,没有日本车),还雇了司机为他开车.不过,爆发户坐车时总是这样:上Benz车后跟司机说"开奔驰车!",坐上Bmw后他说"开宝马车!",

《JAVA与模式》之简单工厂与工厂方法

一.简单工厂 1.1 使用场景 1.工厂类负责创建的对象比较少: 2.客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心: 3.由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用. 1.2 优缺点 优点: 工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了.而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利

工厂设计模式之:简单工厂、工厂方法、抽象工厂

简单工厂模式(Simple Factory):简单工厂模式又叫静态工厂模式,顾名思义,通过一个具体的工厂类,在该工厂类中定义返回值为不同实例对象的静态方法,来获得各种具体的实例对象. 工厂方法模式(Factory Method):建立一个抽象工厂,其不同的工厂实例用来创建不同的产品实例对象(单个产品),如果要增加新的产品,只需增加新的产品工厂即可.符合开闭原则. 抽象工厂模式(Abstract Factory):建立一个抽象工厂,用来实例化工厂子类,这些工厂子类用来生产对应的产品族(即一组对象实