zoukankan      html  css  js  c++  java
  • JS设计模式——7.工厂模式(概念)

    工厂模式

    本章讨论两种工厂模式:

    简单工厂模式

    使用一个类(通常是一个单体)来生成实例。

    使用场景:假设你想开几个自行车商店(创建自行车实例,组装它,清洗它,出售它),每个店都有几种型号的自行车出售。

    /*=====================实现车==========================*/
    var Bicycle = new Interface('Bicycle', ['assemble', 'wash', 'ride', 'repair']);//Interface见2.初识接口那一章的用鸭式辨型模仿接口
    var Speedster = function(){ //实现Bicycle接口
    
    };
    Speedster.prototype = {
        assemble: function(){
    
        },
        wash: function(){
    
        },
        ride: function(){
    
        },
        repair: function(){
    
        }
    };
    /*=====================实现商店========================*/
    var BicycleFactory={ //单体形式的工厂
        createBicycle: function(model){
            var bicycle;
            switch (model){
                case 'The Speedster':
                    bicycle = new Speedster();
                    break;
                case 'The Lowrider':
                    bicycle = new Lowrider();
                    break;
                case 'The Comfort Cruiser':
                default:
                    bicycle = new ComfortCruiser();
            }
            Interface.ensureImplements(bicycle, Bicycle); //Interface见2.初识接口那一章的用鸭式辨型模仿接口
            return bicycle;
        }
    }
    var BicycleShop = function(){};
    BicycleShop.prototype ={
        sellBicycle: function(model){
            var bicycle = BicycleFactory.createBicycle(model); //调用工厂
            bicycle.assemble();
            bicycle.wash();
            return bicycle;
        }
    };
    /*=====================开始卖车========================*/
    var shop1 = new BicycleShop();
    var soldBicycle = shop1.sellBicycle('The Speedster');

    其实,我们完全可以将BicycleFacotry的实现放在BicycleShop.prototype中,那么,为什么会用上工厂模式?

    用工厂模式之后就更加方便管理,当我们需要添加一种新的车型时,只需修改工厂就可以了,省得我们去修改BicycleShop。

    复杂工厂模式

    使用子类来决定一个成员变量应该是哪个具体的类的的实例(按照正式的定义,工厂是一个将其成员对象的实例化推迟到子类中进行的类)

    同样的场景,我们打算让各个自行车商店自行决定从哪个生产厂家进货。

    我们把BicycleShop设计为抽象类,让子类根据各自的进货渠道实现其createBicycle方法。

    /*=============================实现商店=================================*/
    /*=============抽象类BicycleShop============*/
    var BicycleShop = function() {};
    BicycleShop.prototype = {
        sellBicycle: function(model){
            var bicycle = this.createBicycle(model);
            bicycle.assemble();
            bicycle.wash();
            return bicycle;
        },
        createBicycle: function(model){
            throw new Error('Unsupported operation on an abstract class.');
        }
    };
    /*===========商店从Acme公司进货=============*/
    var AcmeBicycleShop = function() {};
    extend(AcmeBicycleShop, BicycleShop); //extend见4.继承(概念)
    AcmeBicycleShop.prototype.createBicycle = function(model){
        var bicycle;
        switch(model){
            case 'The Speedster':
                bicycle = new AcmeSpeedster();
                break;
            case 'The Lowrider':
                bicycle = new AcmeLowrider();
                break;
            case 'The Comfort Cruiser':
            default:
                bicycle = new AcmeComfortCruiser();
        }
        Interface.ensureImplements(bicycle, Bicycle);
        return bicycle;
    }

    这里只是实现了商店,至于自行车的实现如上,就不再重复。

    工厂模式的适用场合

    创建对象的最简单的方法是使用new关键字和具体类.如果不知道工厂模式的适用场合,那么创建和维护工厂所带来的额外复杂性是得不偿失的.

    动态实现

    如果要像前面自行车的例子一样,创建一些用不同方式实现同一接口的对象,那么可以使用一个工厂方法或简单工厂对象来简化实现的过程.

    节省设置开销

    如果对象需要进行复杂并且彼此相关的设置,那么使用工厂模式可以减少每种对象所需的代码量.

    如果这种设置只需为特定类型的所有实例执行一次即可,这种作用尤其突出.

    如果所用的类要求加载外部库的话,这尤其有用.工厂方法可以对这些库进行检查并动态加载那些未找到的库.

    这种设置只存在于一个地方,因此以后改起来也方便很多.

    用许多小型对象组成一个大对象

    工厂方法可以用来创建封装了许多较小对象的对象.

    例如自行车包含许多更小的系统:车轮,车架,车闸等.如果你不想让某个子系统与较大的那个对象之间形成强耦合,而是想在运行是从许多子系统中进行挑选的话,那么工厂模式是一个理想的选择.

  • 相关阅读:
    SharePoint 2010 Crawl Component Stuck in “Recovering” status
    什么是Named Pipes
    请不要修改FIM的配置, 否则SharePoint的User Profile无法获得微软支持
    经典的SharePoint 2010升级中的多核CPU冲突问题
    怎样才能比较方便地查看PowerShell里返回回来的对象的每个成员及它们的值呢?
    如何打开证书控制台
    浏览器: F5 和 Ctrl+F5的区别
    关于用户角色权限管理的探讨
    支付宝接口源代码
    海量数据处理
  • 原文地址:https://www.cnblogs.com/JChen666/p/3622821.html
Copyright © 2011-2022 走看看