定义:

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

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

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

工厂方法模式对简单工厂模式进行了抽象。有一个抽象的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 ();
} } }

最新文章

  1. 细谈Slick(6)- Projection:ProvenShape,强类型的Query结果类型
  2. ASP.NET MVC异常处理
  3. Hive On Spark概述
  4. clang LLVM 介绍和安装(Ubuntu10 64位)
  5. Hibernate缓存原理与策略
  6. C++ 排序函数 sort(),qsort()的用法
  7. mytbatis配置多数据源
  8. DELL配置信息
  9. CodeForce 569A
  10. 求两个字符串最大的子字符串C#
  11. WINFROM 无边框窗体的移动和改变大小
  12. 决策树(C4.5)原理
  13. 使用js jquery分别获取地址栏参数值
  14. ROS(indigo)一个简单灵活和可扩展的2D多机器人仿真器stdr_simulator
  15. Oracle ERP系統借贷关系表
  16. Vue(day4)
  17. flutter sqflite
  18. 《Office 365开发入门指南教程》正式上线,限时优惠和邀请分享推广
  19. css实现div内一段文本的两端对齐
  20. 【转载】 TensorflowOnSpark:1)Standalone集群初体验

热门文章

  1. 51nod 1557 两个集合 (严谨的逻辑题)
  2. HDU 1856 More is better【并查集】
  3. 3ds Max 设置中文界面
  4. 复制excel表,往excel表中写入数据
  5. 搭建appium环境
  6. NodeJS学习笔记 (2)文件系统操作-fs(ok)
  7. 题解 洛谷 P4047 【[JSOI2010]部落划分】
  8. 【codeforces 67A】Partial Teacher
  9. Jedis无法连接centOS7上的redis
  10. Maven项目的坐标GroupId和ArtifactId