Unity3D_简单工厂设计模式

简单工厂模式基本实现流程 
具体产品类:将需要创建的各种不同产品对象的相关代码封装到具体产品类中 
抽象产品类:将具体产品类公共的代码进行抽象和提取后封装在一个抽象产品类中 
工厂类:提供一个工厂类用于创建各种产品,在工厂类中提供一个创建产品的工厂方法,该方法可以根据所传入参数的不同创建不同的具体产品对象 
客户端:只需调用工厂类的工厂方法并传入相应的参数即可得到一个产品对象 
Unity3D_简单工厂设计模式_第1张图片 
简单工厂模式 (Simple Factory Pattern):定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。类创建型模式

在简单工厂模式中用于创建实例的方法通常是静态(static)方法,因此又被称为静态工厂方法(Static Factory Method)模式 
要点:如果需要什么,只需要传入一个正确的参数,就可以获取所需要的对象,而无须知道其创建细节 
Unity3D_简单工厂设计模式_第2张图片 
简单工厂模式包含以下3个角色: 
Factory(工厂角色) 
Product(抽象产品角色) 
ConcreteProduct(具体产品角色)


代码实现

典型的抽象产品类代码:

abstract class Product
{
     //所有产品类的公共业务方法
public void MethodSame() 
{
    //公共方法的实现
}

//声明抽象业务方法
public abstract void MethodDiff();
}

典型的具体产品类代码:
class ConcreteProductA : Product
{
    //实现业务方法
    public override void MethodDiff()
    {
        //业务方法的实现
    }
}


class Factory
{
    //静态工厂方法
    public static Product GetProduct(string arg)
    {
        Product product = null;
        if (arg.Equals("A"))
        {
            product = new ConcreteProductA();
            //初始化设置product
        }
        else if (arg.Equals("B"))
        {
            product = new ConcreteProductB();
            //初始化设置product
        }
        return product;
    }
}

典型的客户端代码:
class Program
{
    static void Main(string[] args)
    {
        Product product;
        product = Factory.GetProduct("A"); //通过工厂类创建产品对象
        product.MethodSame();
        product.MethodDiff();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56

游戏使用实例


namespace SimpleFactory {

    interface IEnemy {

        void Attack();

    }

    class EnemyWater : IEnemy
    {
        public void Attack()
        {
            Console.WriteLine("水枪攻击");
        }
    }

    class EnemyFire : IEnemy{
        public void Attack()
        {
            Console.WriteLine("喷射火焰");
        }
    }


    class EnemyElectric : IEnemy
    {
        public void Attack()
        {
            Console.WriteLine("十万伏特");
        }



    }


    class EnemyFactory {

        public static IEnemy CreateEnemy(string property) {

            if (property == "水系")
            {

                return new EnemyWater();
            }
            else if (property == "火系")
            {

                return new EnemyFire();
            }
            else if (property == "雷系")
            {

                return new EnemyElectric();

            }
            else {

                return null;
            }
        }


        class Test01 {

            public static void Main(string[] args) {

                StreamReader sr = new StreamReader("C:\\config.txt", Encoding.UTF8);
                string str = "";
                while ((str = sr.ReadLine()) != null)
                {
                    IEnemy enemy = EnemyFactory.CreateEnemy(str);
                    enemy.Attack();
                }

            }

        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81

实例说明

某软件公司要基于C#语言开发一套图表库,该图表库可以为应用系统提供多种不同外观的图表,例如柱状图(HistogramChart)、饼状图(PieChart)、折线图(LineChart)等。该软件公司图表库设计人员希望为应用系统开发人员提供一套灵活易用的图表库,通过设置不同的参数即可得到不同类型的图表,而且可以较为方便地对图表库进行扩展,以便能够在将来增加一些新类型的图表。 
现使用简单工厂模式来设计该图表库。 
Unity3D_简单工厂设计模式_第3张图片 
(1) Chart:抽象图表接口,充当抽象产品类 
(2) HistogramChart:柱状图类,充当具体产品类 
(3) PieChart:饼状图类,充当具体产品类 
(4) LineChart:折线图类,充当具体产品类 
(5) ChartFactory:图表工厂类,充当工厂类 
(6) Program:客户端测试类


模式优点

实现了对象创建和使用的分离 
客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可 
通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性


模式缺点

模式缺点 
工厂类集中了所有产品的创建逻辑,职责过重,一旦不能正常工作,整个系统都要受到影响 
增加系统中类的个数(引入了新的工厂类),增加了系统的复杂度和理解难度 
系统扩展困难,一旦添加新产品不得不修改工厂逻辑 
由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构,工厂类不能得到很好地扩展


模式适用环境

工厂类负责创建的对象比较少,由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂 
客户端只知道传入工厂类的参数,对于如何创建对象并不关心


你可能感兴趣的:(Unity3d)