定义:

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

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

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

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

Unity C# 设计模式(三)工厂方法模式的更多相关文章

  1. C#设计模式(3)——工厂方法模式

    一.概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 二.代码实现 namespace 设计模式之工厂方法模式 { /// <summary&g ...

  2. C#设计模式(3)——工厂方法模式(转)

    C#设计模式(3)——工厂方法模式   一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过 ...

  3. Java设计模式之工厂方法模式(转) 实现是抽象工厂?

    Java设计模式之工厂方法模式 责任编辑:覃里作者:Java研究组织   2009-02-25   来源:IT168网站   文本Tag: 设计模式 Java [IT168 技术文章]         ...

  4. 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)

    原文:乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pa ...

  5. php设计模式之工厂方法模式

    php设计模式之工厂方法模式 工厂方法模式 工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Pol ...

  6. Java设计模式学习笔记(三) 工厂方法模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 简介 上一篇博客介绍了简单工厂模式,简单工厂模式存在一个很严重的问题: 就是当系统需要引入 ...

  7. 设计模式之 - 工厂方法模式 (Factory Method design pattern)

    1. 模式意图:  定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 2. 别名(Virtual Constructor) 3. 结构 4. 工厂方法模式C ...

  8. Java设计模式系列-工厂方法模式

    原创文章,转载请标注出处:<Java设计模式系列-工厂方法模式> 一.概述 工厂,就是生产产品的地方. 在Java设计模式中使用工厂的概念,那就是生成对象的地方了. 本来直接就能创建的对象 ...

  9. 设计模式之工厂方法模式(Factory Method Pattern)

    一.工厂方法模式的诞生 在读这篇文章之前,我先推荐大家读<设计模式之简单工厂模式(Simple Factory Pattern)>这篇文档.工厂方法模式是针对简单工厂模式中违反开闭原则的不 ...

  10. 设计模式——从工厂方法模式到 IOC/DI思想

    回顾简单工厂 回顾:从接口的角度去理解简单工厂模式 前面说到了简单工厂的本质是选择实现,说白了是由一个专门的类去负责生产我们所需要的对象,从而将对象的创建从代码中剥离出来,实现松耦合.我们来看一个例子 ...

随机推荐

  1. Codeforces 987B. High School: Become Human

    解题思路: 1.题意:判断x^y和y^x谁大谁小. 2.由于x^y和y^x太大了,时间复杂度也不允许,所以做同等变换,比较e^(ylnx)和e^(xlny). 3.即为比较ylnx和xlny的大小. ...

  2. hiho 1604 - 股票价格,思维题

    题目链接 题目大意 小Hi最近在关注股票,为了计算股票可能的盈利,他获取了一只股票最近N天的价格A1~AN. 在小Hi的策略中,每天可以在下列三种操作中选取一种: 1.什么也不做: 2.按照当天的价格 ...

  3. passwd文件

    1.查看/etc/passwd [admin@localhost /]$ cat -n /etc/passwd 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1: ...

  4. 找出在使用临时表空间的SQL

    SELECT a.username, a.sid, a.serial#, a.osuser, b.tablespace, b.blocks, c.sql_text FROM v$session a, ...

  5. swift内存管理

    为了解决引用循环的问题. However, with ARC, values are deallocated as soon as their last strong reference is rem ...

  6. mysql 将时间转换成时间戳

    select UNIX_TIMESTAMP(addtime/*date_column*/) from tablename 输出:1548658912 数据库原格式:2019-01-28 15:01:2 ...

  7. 操作Map

    ///操作Map Map<String,Object> userInfo = new HashMap(); userInfo.put("uid", adUserEnti ...

  8. The Node.js Event Loop, Timers, and process.nextTick() Node.js事件循环,定时器和process.nextTick()

    个人翻译 原文:https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/ The Node.js Event Loop, Ti ...

  9. Object-C学习比较费劲的3点原因

    作为一名有8年编程经验的资历不浅的程序员,学习Object-C和iOS,感觉效率有点低,至少和学习Android比起来,慢的不是一点点. 主要有以下3个原因: 1.Object-C,和C系列的语言(C ...

  10. 题解 P2532 【[AHOI2012]树屋阶梯】

    本题运用卡特兰数求解. 卡特兰数有两种表达方式: 1)\(h_i=\sum^{k=0}_{i-1}h_kh_{i-k-1}\) 2)\(h_i=\frac{1}{n+1}C^{n}_{2n}\) 运用 ...