工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定实例化哪一个类,而不必实现知道要实例化的是哪一个类。
在这个工厂模式家族中有3种形态:
简单工厂模式,这是他的中文名,英文名叫做Simple Factory。
工厂方法模式,这是他的中文名,英文名叫做Factory Method。
抽象工厂模式,这是他的中文名,英文名叫做Abstract Factory。

现在我们知道了工厂家族在GoF23里面的几个队员叫什么名字,但是还不熟悉怎么使用他。不要着急,现在我们就开始学习如何使用他们。在工厂家族中简单工厂模式是这3种形态里面最简单最直接的一种。我们就先从他下手,然后在逐步的了解工厂方法模式、抽象工厂模式的使用。

相对于OOP来说,每种设计模式都是一套武功心法,而每套心法对应的武功套路就是模式的具体使用的方式。

修炼简单工厂模式的心法如下:
1)工厂类角色Creator:工厂类在客户端的直接控制下(Create方法)创建产品对象。
2)抽象产品角色Product:定义简单工厂创建的对象的父类或它们共同拥有的接口。可以是一个类、抽象类或接口。
3)具体产品角色ConcreteProduct:定义工厂具体加工出的对象。

修炼简单工厂模式的武功套路如下:
 
(备注:上面是简单工厂模式demo里的定向关系图文档的截图!)

修炼心法与武功套路的对应:
1) 工厂类角色Creator对应武功套路里面的ResourceSimpleFactory。
2) 抽象产品角色Product对应武功套路里面的ResourceManager。
3) 具体产品角色ConcreteProduct对应武功套路里面的UIResourceManager和AudioResourceManager。
上面描述了简单工厂模式的修炼心法和武功套路。下面就给出具体的套路细节。
建议:看下面代码之前,自己先动手练习下为好。
工厂类角色:
using  unity Engine;
using System.Collections;
namespace SimpleFactory
{
    /// <summary>
    /// 简单资源工厂类,负责创建UI,Audio等管理器的实例。
    /// </summary>
    public class ResouceSimpleFactory
    {
        // 方式一
        public ResouceManager CreateManager(string type)
        {
            if (type == "UI")
            {
                return new UIResouceManager();
            }
            else if (type == "Audio")
            {
                return new AudioResourceManager();
            }
            else
            {
                return null;
            }
        }
        //方式二
        public ResouceManager CreateManager(ResourceEnum re)
        {
            switch (re)
            {
                case ResourceEnum.UIResource:
                    return new UIResouceManager();
                case ResourceEnum.AudioResouce:
                    return new AudioResourceManager();
                default:
                    return null;
            }
        }
    }
}
抽象产品类:
using UnityEngine;
using System.Collections;
namespace SimpleFactory
{
    /// <summary>
    /// 资源管理器基类,抽象产品
    /// </summary>
    public abstract class ResouceManager
    {
        public abstract void LoadConfig(string path);
        public abstract void LoadAsset(string name);
        public abstract void UnLoadResource(bool status);
    }
}
具体产品类:
具体产品AudioResourceManager:
using UnityEngine;
using System.Collections;
namespace SimpleFactory
{
    /// <summary>
    /// Audio资源管理器,抽象产品的具体产品
    /// </summary>
    public class AudioResourceManager : ResouceManager
    {
        public override void LoadConfig(string path)
        {
            Debug.Log("加载和音乐有关的配置文件");
        }
        public override void LoadAsset(string name)
        {
            Debug.Log("加载音乐文件");
        }
        public override void UnLoadResource(bool status)
        {
            Debug.Log("卸载加载的音乐文件");
        }
    }
}
具体产品UIResourceManager:
using UnityEngine;
using System.Collections;
namespace SimpleFactory
{
    /// <summary>
    /// UI资源管理器,抽象产品的具体产品
    /// </summary>
    public class UIResouceManager : ResouceManager
    {
        public override void LoadConfig(string path)
        {
            Debug.Log("加载UI的配置文件");
        }
        public override void LoadAsset(string name)
        {
            Debug.Log("加载UI里面的资源");
        }
        public override void UnLoadResource(bool status)
        {
            Debug.Log("卸载加载的UI资源");
        }
    }
}
资源类型枚举类:
using UnityEngine;
using System.Collections;
namespace SimpleFactory
{
    /// <summary>
    /// 定义资源枚举类型
    /// </summary>
    public enum ResourceEnum
    {
        None,
        UIResource,
        AudioResouce
    }
}
客户端测试类:
using UnityEngine;
using System.Collections;
namespace SimpleFactory
{
    /// <summary>
    /// 使用资源管理器的客户端
    /// </summary>
    public class ResouceSimpleFactoryClient : MonoBehaviour
    {
        ResouceSimpleFactory rf;
        public void Start()
        {
            rf = new ResouceSimpleFactory();
        }
        public void OnGUI()
        {
            if (GUILayout.Button("UI管理器"))
            {
                UIResouceManager ui = rf.CreateManager("UI") as UIResouceManager;
                ui.LoadConfig("http:.......");
                ui.LoadAsset("蛮牛");
                ui.UnLoadResource(false);
            }
            if (GUILayout.Button("Audio管理器"))
            {
                AudioResourceManager am = rf.CreateManager("Audio") as AudioResourceManager;
                am.LoadConfig("http:.....");
                am.LoadAsset("蛮牛");
                am.UnLoadResource(false);
            }
        }
    }
}
搞懂了上面的武功心法和武功套路,你也就领悟了简单工厂模式。
每种武功都有他的优缺点,例如七伤拳,你懂得。那么简单工厂模式的优缺点是什么呢?接着往下看,你就明白了。
简单工厂模式优缺点:
优点:
工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅"消费"产品。简单工厂模式通过这种做法实现了对责任的分割。
缺点:
1) 当产品有复杂的多层等级结构时,工厂类只有自己,以不变应万变,就是模式的缺点。因为工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
2) 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,有可能造成工厂逻辑过于复杂。
3) 简单工厂模式通常使用静态工厂方法,这使得无法由子类继承,造成工厂角色无法形成基于继承的等级结构。

在这里野猪先给大家提一个醒,GoF23设计模式里面的每种模式都是针对某类特定问题的解决策略。So,没有什么设计模式是完美的!

好了,简单工厂模式就讲到这里。敬请期待如何修炼工厂方法模式。
Tips: 告诉大家一个小秘密,简单工厂模式实际上不是GoF23设计模式的一员哦!

[转载野猪的一篇文章] 设计模式--简单工厂模式在unity3d里面的使用相关推荐

  1. JavaScript设计模式--简单工厂模式例子---XHR工厂

    JavaScript设计模式--简单工厂模式例子---XHR工厂 第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方 ...

  2. 设计模式—简单工厂模式

    前言 简单工厂模式是一种比较容易理解的设计模式 简单工厂模式介绍 在设计模式中,简单工厂模式可以理解为负责生产对象的一个类,当使用new 关键字创建一个对象时,此时该类就依赖于这个对象,也就是他们间的 ...

  3. 三角形圆形创建与擦除java_设计模式---------------简单工厂模式

    设计模式---------------简单工厂模式 一.题目(Question) 使用简单工厂模式设计一个可以创建不同几何形状(如圆形.方形和三角形等)的绘图工具,每个几何图形都要有绘制draw()和 ...

  4. 设计模式 - 简单工厂模式

    文章目录 设计模式 - 简单工厂模式 1.意图 2.实例 1.创建颜色接口 - 定义生产的产品是什么 2.创建颜色枚举 - 定义生产哪些类型的产品 3.根据颜色枚举创建产品 - 根据产品清单生产产品 ...

  5. [Python设计模式] 第1章 计算器——简单工厂模式

    github地址:https://github.com/cheesezh/python_design_patterns 写在前面的话 """ 读书的时候上过<设计模 ...

  6. C#设计模式--简单工厂模式

    设计模式: 简单工厂模式(Simple Factory Pattern) 介绍:简单工厂模式不是Gof23种设计模式之一.但它在实际的编程中经常被用到,而且思想也非常简单,下面简单举例说明: 简单工厂 ...

  7. 设计模式 简单工厂模式

    简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂 ...

  8. 设计模式 -- 简单工厂模式

    写在前面的话:读书破万卷,编码如有神 -------------------------------------------------------------------- 主要内容包括: 初识简单 ...

  9. 大化设计模式——简单工厂模式(一)

    参考程杰<大化设计模式>,把里面的代码用Java重新实现了一遍 定义运算类: package simpleFactoryPattern; /** * @author lei_chunhui ...

  10. 设计模式-简单工厂模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的: 简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简单工厂模式是由一个工 ...

最新文章

  1. matlab 读取WAV文件
  2. 【控制】《鲁棒控制-线性矩阵不等式处理方法》-俞立老师-附录-LMI工具箱介绍
  3. 计算机专业论文关于天气预报的,关于天气预报论文范文写作 天气预报相关论文写作资料...
  4. 与大家分享一下2010我的找工作历程!真累啊!不过都已经结束了!
  5. qsort与sort
  6. php.ini配置详解 号,php INI配置文件的解析实现分析
  7. Spring-AOP概念及使用教程
  8. jsonobject转map对象_解析JSON中JSONObject的高级使用
  9. Server.MapPath() 探究
  10. 对接GA/T1400协议注册流程简易demo【Java版】
  11. TCPIP详解 习题一
  12. 如何计算吃鸡游戏的物理碰撞?
  13. WIN7 Activation,完美激活Windows 7,开机无字符,无OEM信息
  14. ubuntu 中的流程图绘制软件
  15. linux系统可以安装企业微信,Linux 上安装微信客户端
  16. 如何使用QuickTime Player一键视频压缩
  17. 座位安排(seat)
  18. SAP货物移动BAPI BAPI_GOODSMVT_CREATE(WMS TO SAP)
  19. 单源最短路径 Dijkstra+优先队列
  20. 程序员“996”,真的能带来高产出吗?

热门文章

  1. 从3D打印到python编程 从opencv到人脸识别 从win10到树莓派ubuntu (全教程附代码)
  2. 大数据相关面试题整理-带答案-难一点
  3. Gym Atari: Gym no longer distributes ROMs.
  4. 微软修复了国家安全局上报的Windows严重漏洞
  5. Android开放root权限
  6. 1 一文详细阐述UI设计颜色搭配,受益匪浅~
  7. IBM-P55A小型机内存故障
  8. 12个“无用”之美,你有没有被惊艳到?
  9. Java毕业设计_智能快递柜的设计与实现
  10. [python3]读取docx每个段落下的table数据