Unity 设计模式之 简单工厂模式的实例介绍

2025-09-25 04:14:43

1、概述:

  将一个具体类的实例化交给一个静态工厂方法来执行,它不属于GOF的23种设计模式,但现实中却经常会用到

2、模式中的角色:

  2.1 工厂类(Simple Factory): 只包含了创建具体类的静态方法。

  2.2 抽象产品(Product):定义简单工厂中要返回的产品。

  2.3 具体产品(ConcreteProduct):具体产品。

3、模式解读:

  3.1 简单工厂模式的一般化类图

Unity 设计模式之 简单工厂模式的实例介绍

4、模式总结:

  4.1 优点:

    4.1.1 职责单一,实现简单,且实现了客户端代码与具体实现的解耦。

    4.1.2 工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定

的信息,决定究竟应该创建哪个具体类的对象.

    4.1.3 通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.

    4.1.4 明确了各自的职责和权利,有利于整个软件体系结构的优化。

  4.2 缺点:

    4.2.1 由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。因此它是违背开放封闭原则的。

    4.2.2 当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;

    注:这些缺点在工厂方法模式中得到了一定的克服。

  4.3 使用场景:

    4.3.1 工厂类负责创建的对象比较少;

    4.3.2 客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;

    4.3.3 由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。

1、打开Unity,新建一个空工程,具体如下图

Unity 设计模式之 简单工厂模式的实例介绍

2、在工程中,新建几个脚本,然后双击打开,具体如下图

Unity 设计模式之 简单工厂模式的实例介绍

3、脚本的具体代码和代码内容如下图

Unity 设计模式之 简单工厂模式的实例介绍

Unity 设计模式之 简单工厂模式的实例介绍

Unity 设计模式之 简单工厂模式的实例介绍

Unity 设计模式之 简单工厂模式的实例介绍

Unity 设计模式之 简单工厂模式的实例介绍

Unity 设计模式之 简单工厂模式的实例介绍

Unity 设计模式之 简单工厂模式的实例介绍

4、Operation 脚本具体内容如下:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

/// <summary>

/// 计算器操作运算符的基类

/// </summary>

public class Operation {

    //参数

    private double _numberA = 0;

    private double  _numberB = 0;

    public double NumberA {

        get {

            return _numberA;

        }

        set {

            _numberA = value;

        }

    }

            public double NumberB {

        get {

            return _numberB;

        }

        set {

            _numberB = value;

        }

    }

    /// <summary>

    /// Gets the result,结果运算虚函数.

    /// </summary>

    /// <returns>The result.</returns>

    public virtual double GetResult() {

                double result = 0;

        return result;

    }

}

5、OperationAdd 脚本具体内容如下:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

/// <summary>

/// 加法运算

/// </summary>

public class OperationAdd : Operation {

    /// <summary>

    /// Gets the result,结果运算重载函数.

    /// </summary>

    /// <returns>The result.</returns>

    public override double GetResult() {

        double result = 0;

        result = NumberA + NumberB;

        return result;

    }

}

6、OperationSub 脚本具体内容如下:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

/// <summary>

/// 减法运算.

/// </summary>

public class OperationSub : Operation {

    /// <summary>

    /// Gets the result,结果运算重载函数.

    /// </summary>

    /// <returns>The result.</returns>

    public override double GetResult() {

        double result = 0;

        result = NumberA - NumberB;

        return result;

    }

}

7、OperationMul 脚本具体内容如下:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

/// <summary>

/// 乘法运算

/// </summary>

public class OperationMul : Operation {

    /// <summary>

    /// Gets the result,结果运算重载函数.

    /// </summary>

    /// <returns>The result.</returns>

    public override double GetResult() {

        double result = 0;

        result = NumberA * NumberB;

        return result;

    }

}

8、OperationDiv 脚本具体内容如下:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using System;

/// <summary>

/// 除法运算

/// </summary>

public class OperationDiv : Operation {

    /// <summary>

    /// Gets the result,结果运算重载函数.

    /// </summary>

    /// <returns>The result.</returns>

    public override double GetResult() {

        double result = 0;

        if (NumberB == 0)

            throw new Exception ("除数不能为 0 ");

                result = NumberA / NumberB;

        return result;

    }

}

9、SimpleOperationFactory 脚本具体内容如下:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

/// <summary>

/// Simple operation factory.

/// </summary>

public class SimpleOperationFactory {

    /// <summary>

    /// Creates the operate.

    /// </summary>

    /// <returns>The operate.</returns>

    /// <param name="operate">Operate.</param>

    public static Operation CreateOperate(string operate){

                Operation oper = null;

        switch(operate){

                    case "+":

            oper = new OperationAdd ();

            break;

        case "-":

            oper = new OperationSub ();

            break;

        case "*":

            oper = new OperationMul ();

            break;

        case "/":

            oper = new OperationDiv ();

            break;

        }

        return oper;

    }

}

10、Test 脚本具体内容如下:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class Test : MonoBehaviour {

    // Use this for initialization

    void Start () {

        Operation oper = new Operation ();

        oper = SimpleOperationFactory.CreateOperate ("*");

        oper.NumberA = 2;

        oper.NumberB = 6;

        double result = oper.GetResult ();

        Debug.Log ("2 * 6 = "+result);

    }

        // Update is called once per frame

    void Update () {

            }

}

11、脚本编译正确,回到Unity界面,在场景中新建一个 GameObject,并把 Test 脚本赋给 GameObject,具体如下图

Unity 设计模式之 简单工厂模式的实例介绍

12、运行场景,控制台 Console 打印如下图

Unity 设计模式之 简单工厂模式的实例介绍

13、到此,《Unity 设计模式之 简单工厂模式的实例介绍》讲解结束,谢谢

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢