定义:
定义一个创建对象的接口(父类),由子类决定需要实例化哪一个类。
这样,核心工厂类成为了一个抽象角色,不再负责产品的创建,仅提供具体工厂类所必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现“开-闭 原则”,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。
工厂方法模式对简单工厂模式进行了抽象。有一个抽象的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 (); } }}