定义:

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

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

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

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

注意:

如果不存在”多系列对象创建“的需求变化,则没必要应用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 "红色的";
}
}

Unity C# 设计模式(四)抽象工厂模式的更多相关文章

  1. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...

  2. 桥接模式及C++实现 C++设计模式-AbstractFactory抽象工厂模式

    桥接模式及C++实现 桥接模式 先说说桥接模式的定义:将抽象化(Abstraction)与实现化(Implementation)分离,使得二者可以独立地变化. 桥接模式号称设计模式中最难理解的模式之一 ...

  3. Java 设计模式之抽象工厂模式(三)

    原文地址:Java 设计模式之抽象工厂模式(三) 博客地址:http://www.extlight.com 一.前言 上篇文章 <Java 设计模式之工厂模式(二)>,介绍了简单工厂模式和 ...

  4. 【Unity与23种设计模式】抽象工厂模式(Abstract Factory)

    GoF中定义: "提供一个能够建立整个类群组或有关联的对象,而不必指明它们的具体类." 意思就是 根据不同的执行环境产生不同的抽象类子类 抽象工厂模式经常在面试中会涉及到 下面的例 ...

  5. Java设计模式学习笔记(四) 抽象工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 抽象工厂模式概述 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问 ...

  6. 二十四种设计模式:抽象工厂模式(Abstract Factory Pattern)

    抽象工厂模式(Abstract Factory Pattern) 介绍提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例有Message和MessageModel,Messag ...

  7. java设计模式之抽象工厂模式

    上一篇文章(http://www.cnblogs.com/liaoweipeng/p/5768197.html)讲了简单工厂模式,但是简单工厂模式存在一定的问题,如果想要拓展程序,必须对工厂类进行修改 ...

  8. C#设计模式(4)-抽象工厂模式

    引言 上一篇介绍了设计模式中的简单工厂模式-C#设计模式(3)-工厂方法模式,本篇将介绍抽象工厂模式: 抽象工厂模式简介 抽象工厂模式(AbstractFactory):提供一个创建一系列相关或相互依 ...

  9. C#设计模式之四抽象工厂模式(AbstractFactory)【创建型】

    一.引言     写了3篇有关设计模式的文章了,大家有了些反馈,说能从中学到一些东西,我感到很欣慰,那就继续努力.今天我要写第四个模式了,该模式叫抽象工厂.上一篇文章我们讲了[工厂方法]模式,它是为了 ...

  10. Head First设计模式之抽象工厂模式

    一.定义 给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足一下条件:     1)系统中有多个产品族,而系统一次只可能消费其中一族产品.      2)同属于同一个 ...

随机推荐

  1. 1806最大数 string和sort函数用法

    1.C++自带sort函数用法 sort函数有三个参数: (1)第一个是要排序的数组的起始地址 (2)第二个是结束的地址(最后一位要排序的地址) (3)第三个参数是排序的方法,可以是从大到小也可是从小 ...

  2. servlet中Cookie的编码问题

    a.什么是Cookie的编码问题?      Cookie只能存放合法的ascii字符,如果是非asicc字符(比如中文),     需要转换成合法的ascii字符的形式.  b.如何处理?     ...

  3. 手把手教你如何新建scrapy爬虫框架的第一个项目(下)

    前几天小编带大家学会了如何在Scrapy框架下创建属于自己的第一个爬虫项目(上),今天我们进一步深入的了解Scrapy爬虫项目创建,这里以伯乐在线网站的所有文章页为例进行说明. 在我们创建好Scrap ...

  4. vue生命周期-学习心得

    每个Vue实例在被创建之前都要经过一系列的初始化过程,也就是从开始创建.初始化数据.编译模板.挂载Dom.渲染→更新→渲染.销毁等一系列过程,这个过程就是vue的生命周期. 1 vue生命周期图 {: ...

  5. BZOJ 3881 [COCI2015]Divljak (Trie图+Fail树+树链的并+树状数组维护dfs序)

    题目大意: Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: “1 P”,Bob往自己的集合里添加了一个字符串P. ...

  6. caioj 1158 欧拉函数

    直接套模板,这道题貌似单独求还快一些 解法一 #include<cstdio> #include<cctype> #define REP(i, a, b) for(int i ...

  7. unity Android在streamingAssets路径下文件无法读取的的解决方法

    unity Android在streamingAssets路径下文件,有时候plugin下的.jar或者.so无法直接读取: 解决方法之一,拷贝至其他路径: #if UNITY_ANDROID str ...

  8. 洛谷 P2734 游戏 A Game

    P2734 游戏 A Game 题目背景 有如下一个双人游戏:N(2 <= N <= 100)个正整数的序列放在一个游戏平台上,游戏由玩家1开始,两人轮流从序列的任意一端取一个数,取数后该 ...

  9. Google笔试(2015年8月)

    华电北风吹 天津大学认知计算与应用重点实验室 日期:2015/8/21 这三道题目的PDF能够在这里下载 https://github.com/ncepuzhengyi/jobHuntingExam/ ...

  10. cocos2d_android 第一个游戏

    依据上一篇文章.创建好cocos2d--android的开发环境 先上效果图 实现该效果的代码: package com.cn.firstgame; import org.cocos2d.layers ...