博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unity C# 设计模式(三)工厂方法模式
阅读量:6165 次
发布时间:2019-06-21

本文共 2458 字,大约阅读时间需要 8 分钟。

定义:

定义一个创建对象的接口(父类),由子类决定需要实例化哪一个类。

这样,核心工厂类成为了一个抽象角色,不再负责产品的创建,仅提供具体工厂类所必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。

工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现“开-闭 原则”,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。

工厂方法模式对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不再负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。

在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。

 

相关模式:

1、抽象工厂:经常用工厂方法创建各个部件。

2、模板方法:在定义模板方法的类中经常定义工厂方法来创建相应的对象。

 

示例:

/*工厂方法模式:Factory Method 这里简写为FM,定义一个创建对象的接口,让子类决定实例哪一个类,核心结构有四个角色:1、抽象工厂:CarFactory_FM 类,制定一个创建对象的规范2、具体工厂:SkodaCarFactory_FM 类和FerrariCarFactory_FM 类,负责具体的创建3、抽象产品:Car_FM 类4、具体产品:SkodaCar_FM 类和 FerrariCar_FM 类在这个模式中,工厂类和产品类往往可以依次对应,即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。*/public abstract class CarFactory_FM {    public abstract Car_FM CarCreate ();}

 

public class SkodaCarFactory_FM : CarFactory_FM {    public override Car_FM CarCreate ()    {        return new SkodaCar_FM ();//生产了一辆斯柯达    }}

 

public class FerrariCarFactory_FM : CarFactory_FM {        public override Car_FM CarCreate ()    {        return new FerrariCar_FM ();//生产一辆法拉利    }}

 

public abstract class Car_FM {    public abstract void Launch();//启动    public abstract void Run();//    public abstract void Stop();}

 

using UnityEngine;public class SkodaCar_FM : Car_FM {        public override void Launch ()    {        Debug.Log ("斯柯达发动了");    }    public override void Run ()    {        Debug.Log ("斯柯达跑起来了");    }    public override void Stop ()    {        Debug.Log ("斯柯达抛锚了");    }    }

 

using UnityEngine;public class FerrariCar_FM : Car_FM {    public override void Launch ()    {        Debug.Log ("法拉利发动了");    }    public override void Run ()    {        Debug.Log ("法拉利跑起来了");    }    public override void Stop ()    {        Debug.Log ("法拉利抛锚了");    }}

 

using System.Collections;using System.Collections.Generic;using UnityEngine;public class Client_FM : MonoBehaviour {    void Update () {                //调用        if (Input.GetKeyDown(KeyCode.F)) {            CarFactory_FM factory = new FerrariCarFactory_FM ();            Car_FM car = factory.CarCreate ();            car.Launch ();            car.Run ();            car.Stop ();        }        if (Input.GetKeyDown(KeyCode.S)) {            CarFactory_FM factory = new SkodaCarFactory_FM ();            Car_FM car = factory.CarCreate ();            car.Launch ();            car.Run ();            car.Stop ();        }    }}

 

转载于:https://www.cnblogs.com/Jason-c/p/8794202.html

你可能感兴趣的文章
Decommissioning a Domain Controller 降域控
查看>>
Character中的奇葩
查看>>
c++书籍推荐
查看>>
轻松监听Azure service health 状态
查看>>
获取SQL SERVER某个数据库中所有存储过程的参数
查看>>
在Linux下编译安装Apache2(2)
查看>>
Method Swizzling 处理一类简单的崩溃
查看>>
AngularJS学习!
查看>>
在Eclipse中搭建Python Django
查看>>
struts国际化
查看>>
Laravel 5.0 - Middleware (中间件)
查看>>
文件特殊权限及facl
查看>>
我的友情链接
查看>>
Android按两次返回键退出应用
查看>>
第一章:认识Redhat Linux
查看>>
文本查看指令
查看>>
我的友情链接
查看>>
android开源项目框架大全:《IT蓝豹》
查看>>
数据库 : 事物以及隔离性导致的问题
查看>>
Jquery乱码终极解决方案
查看>>