zoukankan      html  css  js  c++  java
  • 工厂模式理解

    工厂的作用就是生产实例,但其与构造函数不同。工厂是用来生产多种类型实例的。例如,麦当劳可以生产汉堡,薯条和可乐,再例如,美的可以生产冰箱,洗衣机,和空调等。工厂生产的产品必须要用相关性,属于一个产品族或者属于多个相近的产品族。

    工厂模式分为三种,分别是

    1. 简单工厂,通过switch语句根据产品标识生产不同类型的产品,直接调用各种产品的构造函数
    2. 工厂,对简单工厂的优化,将工厂进行抽象,新增产品只需增加指定工厂和产品,不需要修改单一工厂的switch语句,不会影响其他产品
    3. 抽象工厂,比工厂模式多的就是,可以生产多个产品族,就是一个工厂可以同时生产多个产品,而普通工厂只能生产一个产品

    (ES6)代码实现如下:

    1.简单工厂

    class SimpleFactory{
        constructor(prodNo) //构造工厂时告知工厂产品标识
        {
            this.prodNo = prodNo;
        }
    
        GetProduct()
        {
            switch (this.prodNo) //根据产品标识生产产品
            {
                default:
                    return new ProductA();
                case 1:
                    return new ProductA();
                case 2:
                    return new ProductB();
            }
    
        }
    }
    
    //产品接口
    class IProduct
    {
        //产品方法
        //......
    }
    //产品A
    class ProductA extends IProduct 
    {
        //产品属性
        //......
    }
    
    //产品B
    class ProductB extends IProduct
    {
        //产品属性
        //......
    }

    2.工厂模式

    class IFactory //工厂接口
    {
        GetProduct(){
    
        }
    }
    //A工厂类
    class FactoryA extends IFactory
    {
        constructor()
        {
            this.productA = new ProductA();
        }
        //A工厂生产A产品
        GetProduct() 
        {
            return this.productA;
        }
    }
    
    //B工厂类
    class FactoryB extends IFactory
    {
        constructor()
        {
            this.productB = new ProductB();
        }
        //B工厂生产B产品
        GetProduct() 
        {
            return this.productB;
        }
    }
    
    //产品接口
    class IProduct
    {
        //产品方法
        //......
    }
    
    //产品A
    class ProductA extends IProduct
    {
        //产品属性
        //......
    }
    
    //产品B
    class ProductB extends IProduct
    {
        //产品属性
        //......
    }

    3.抽象工厂

    //工厂接口,即抽象工厂
    class IFactory
    {
        CreateFridge();
        CreateAirCondition();
    }
    
    //三星的工厂,生产三星的产品族
    class SamsungFactory extends IFactory
    {
    
        CreateAirCondition() 
        {
            return new SamsungAirCondition(); //三星的工厂生产三星的空调
            
        }
    
        CreateFridge()
        {
            return new SamsungFridge(); //三星的工厂生产三星的冰箱
        }
    }
    
    //格力的工厂,生产格力的产品族
    class GreeFactry extends IFactory
    {
        CreateAirCondition()
        {
            return new GreeAirCondition(); //格力的工厂生产格力的空调
        }
    
        CreateFridge()
        {
            return new GreeFridge(); //格力的工厂生产格力的冰箱
        }
    }
    
    //冰箱产品接口
    class IFridge
    {
        //冰箱产品接口
        //冰箱的action
    }
    
    //空调接口
    class IAirCondition
    {
        //空调产品接口
        //空调的action
    }
    
    //三星的冰箱
    class SamsungFridge extends IFridge
    {
        //三星冰箱的action和property
    }
    //格力的冰箱
    class GreeFridge extends IFridge
    {
            //格力冰箱的action和property
    }
    
    //三星的空调
    class SamsungAirCondition extends IAirCondition
    {
        //三星空调的action和property
    }
    //格力的空调
    class GreeAirCondition extends IAirCondition
    {
        //格力空调的action和property
    }

    参考:http://blog.jobbole.com/109594/

  • 相关阅读:
    通过JDBC连接oracle数据库的十大技巧
    asp.net里导出excel表方法汇总
    流式媒体
    html 另存为/打印/刷新/查看原文件等 代码
    JSP 语法详解
    让一个网页打开的同时自动为另一个网页自动填写表单并提交
    StreamWriter输出中文乱码的问题
    “mailto”的六则应用技巧
    返回目录大小
    JDBC基础(二)
  • 原文地址:https://www.cnblogs.com/mengff/p/8426519.html
Copyright © 2011-2022 走看看