zoukankan      html  css  js  c++  java
  • Unity C# 设计模式(四)抽象工厂模式

    定义:

    提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

    工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结构。

    抽象工厂模式使用同一个 工厂等级结构负责这些不同产品等级结构产品对象的创建。

    所谓的抽象工厂是指一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象。

    注意:

    如果不存在”多系列对象创建“的需求变化,则没必要应用Abstract Factory模式,静态工厂方法足矣。
     "系列对象"指的是这些对象之间有相互依赖、或作用的关系。例如游戏开发场景中的"道路"与"房屋"依赖,“道路”与“地道”的依赖。
    Abstract Factory模式主要在于应对"新系列"的需求变动。其缺点在于难以应对”新对象“的需求变动。
    Abstract Factory模式经常和Factory Method模式共同组合来应对“对象创建”的需求变化。

    区别:

    Factory Mehtod模式解决"单个对象"的需求变化,AbstractFactory模式解决"系列对象"的需求变化,Builder模式解决"对象部分"的需求变化。

    示例代码:

    /*
    抽象工厂模式:Abstract factory 这里简写为AF,为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
    所谓的抽象工厂是指一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象。
    
    抽象工厂:AbstractFactory_AF 类,
    具体工厂:FerrariFactory_AF 类,SkodaFactory_AF类
    抽象产品:CarColor_AF 类,CarAction_AF 类
    具体产品:ColorRed_AF ,ColorBlack_AF 和 FerrariCar_AF,SkodaCar_AF
    
    产品之间相互依赖
    */
    
    public abstract class AbstractFactory_AF  {
        public abstract CarColor_AF CreateColor();
        public abstract CarAction_AF CreateCar();//汽车行为
    }
    using UnityEngine;
    
    public class SkodaFactory_AF : AbstractFactory_AF {
    
        public override CarColor_AF CreateColor ()
        {
            return new ColorBlack_AF ();
        }
    
        public override CarAction_AF CreateCar ()
        {
            return new SkodaCar_AF ();
        }
    }
    using UnityEngine;
    
    public class FerrariFactory_AF : AbstractFactory_AF {
    
        public override CarColor_AF CreateColor ()
        {
            return new ColorRed_AF ();
        }
    
        public override CarAction_AF CreateCar ()
        {
            return new FerrariCar_AF ();
        }
            
    }
    using UnityEngine;
    
    public abstract class CarAction_AF {
        public abstract void Launch(CarColor_AF carColor);
        public abstract void Run(CarColor_AF carColor);
        public abstract void Stop(CarColor_AF carColor);
    }
    using UnityEngine;
    
    public class FerrariCar_AF : CarAction_AF {
    
        public override void Launch (CarColor_AF carColor)
        {
            Debug.Log (carColor.GetColor()+"法拉利发动了");
        }
        public override void Run (CarColor_AF carColor)
        {
            Debug.Log (carColor.GetColor()+"法拉利跑起来了");
        }
        public override void Stop (CarColor_AF carColor)
        {
            Debug.Log (carColor.GetColor()+"法拉利抛锚了");
        }
    }
    using UnityEngine;
    
    public class SkodaCar_AF : CarAction_AF {
    
        public override void Launch (CarColor_AF carColor)
        {
            Debug.Log (carColor.GetColor()+"斯柯达发动了");
        }
        public override void Run (CarColor_AF carColor)
        {
            Debug.Log (carColor.GetColor()+"斯柯达跑起来了");
        }
        public override void Stop (CarColor_AF carColor)
        {
            Debug.Log (carColor.GetColor()+"斯柯达抛锚了");
        }
    }
    public abstract class CarColor_AF {
    
        public abstract string GetColor ();
    }
    public class ColorBlack_AF : CarColor_AF {
    
        public override string GetColor ()
        {
            return "黑色的";
        }
    }
    public class ColorRed_AF : CarColor_AF {
    
        public override string GetColor ()
        {
            return "红色的";
        }
    }
  • 相关阅读:
    Server08 R2 Live Migration 测试 Part 6:使用SCVMM 2008 R2进行Live Migration
    Workstation 可成功安装ESX但发现不到本地存储的解决方法
    代码生成器ltscode2.1
    2010面试攻略
    我看代码生成
    程序员如何提高工作效率
    PE格式全分析
    Quartz.NET 2.0 学习笔记(4) :cron表达式
    asp.net 2.0 访问 MySQL 数据库
    My blog.
  • 原文地址:https://www.cnblogs.com/Jason-c/p/8796449.html
Copyright © 2011-2022 走看看