抽象工厂模式是是用一个超级工厂去创建其他工厂,简单点说就是工厂的父类,属于创建型模式。

目标:提供一个创建一组对象的方法,而无需指定它们具体的类(同工厂方法)。

使用场景:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

实现:在一个工厂里聚合多个同类产品。

案例

上一个工厂方法模式的案例是 一家生产电子产品的工厂,可以生产各种电子产品,但是这时候集团还拥有一家生产服装的工厂,

怎么能把这两个工厂给管理起来,其实把公产管理起来这样更加有助于去理解业务中的类的组织管理,不至于混乱不清晰。

namespace DesignPatterns.AbstractFactory
{
/// <summary>
/// 抽象工厂
/// </summary>
public abstract class AbstractFactory
{
public virtual ElectronicProduct GetElectronicProduct(string name)
{
throw new NullReferenceException();
}
public virtual CarProduct GetCarProduct(string name)
{
throw new NullReferenceException();
}
}
/// <summary>
/// 抽象工厂生成器,抽象工厂的调用入口
/// </summary>
public class FactoryProducer
{
/// <summary>
/// 根据名称获取子类工厂的实例
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public static AbstractFactory GetFactory(string name)
{
if (name.ToLower() == "car")
return new CarFactory();
if (name.ToLower() == "electronic")
return new ElectronicFactory();
return null;
}
} #region 子类工厂 实现抽象工厂的方法
public class CarFactory : AbstractFactory
{
public override CarProduct GetCarProduct(string name)
{
if (name.ToLower() == "motorbike")
return new Motorbike();
if (name.ToLower() == "xpandrally")
return new XpandRally();
throw new Exception("unknow product name");
}
} public class ElectronicFactory : AbstractFactory
{
public override ElectronicProduct GetElectronicProduct(string name)
{
if (name.ToLower() == "tv")
return new TV();
if (name.ToLower() == "mp4")
return new MP4();
if (name.ToLower() == "mp3")
return new MP3();
throw new Exception("unknow product name");
}
} #endregion #region 子类工厂的产品 public abstract class CarProduct
{
public abstract void Run();
} public class Motorbike : CarProduct
{
public override void Run()
{
Console.WriteLine("摩托车");
}
} public class XpandRally : CarProduct
{
public override void Run()
{
Console.WriteLine("拉力赛车");
}
} public abstract class ElectronicProduct
{
public abstract void Play();
} public class TV : ElectronicProduct
{
public override void Play()
{
Console.WriteLine("TV play");
}
} public class MP4 : ElectronicProduct
{
public override void Play()
{
Console.WriteLine("MP4 play");
}
} public class MP3 : ElectronicProduct
{
public override void Play()
{
Console.WriteLine("MP3 play");
}
} #endregion public class AbstractFactoryTest
{
public static void Test()
{
//实例化造车工厂
AbstractFactory carFactory = FactoryProducer.GetFactory("car");
//获取摩托车实例
var motorbike = carFactory.GetCarProduct("motorbike");
//执行实例方法
motorbike.Run();
//实例化电子厂
AbstractFactory electronicFactory = FactoryProducer.GetFactory("electronic");
//获取tv实例
var tv = electronicFactory.GetElectronicProduct("tv");
tv.Play();
}
}
}

Abstract Factory抽象工厂模式的更多相关文章

  1. c++ 设计模式9 (Abstract Factory 抽象工厂模式)

    5.2 抽象工厂模式 动机:在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时,由于需求的变化,往往存在更多系列对象的创建工作. 代码示例: 实现利用数据库的业务逻辑,支持多数据库(Sq ...

  2. 设计模式(一): abstract factory抽象工厂模式 -- 创建型模式

    1.定义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 2.适用场景 1.一个系统要独立于它的产品创建.组合和表示. 2.一个系统要由多个产品系列中的一个来配置. 3.当你要 ...

  3. Java设计模式:Abstract Factory(抽象工厂)模式

    概念定义 抽象工厂(Abstract Factory)模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式中,系统的产品有多于一个的产品族(一个产品族里定义多个产品) ...

  4. 一天一个设计模式——Abstract Factory抽象工厂模式

    一.模式说明 前面学习了工厂方法(Factory Method)模式.在工厂方法模式中,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类,具体的处理交由子类来处理.这里学习的抽象工厂 ...

  5. 面向对象设计模式纵横谈:Abstract Factory 抽象工厂模式(笔记记录)

         今天是设计模式的第二讲,抽象工厂的设计模式,我们还是延续老办法,一步一步的.演变的来讲,先来看看一个对象创建的问题. 1.如何创建一个对象 常规的对象创建方法: 这样的创建对象没有任何问题, ...

  6. Abstract Factory 抽象工厂模式

    提供一个创建一些列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂顾名思义就是对工厂的抽象,它提供了一组创建抽象产品对象的操作接口,我们实际使用的是抽象工厂的派生类,派生类中提供了操作的具 ...

  7. 2.设计模式-Abstract Factory 抽象工厂模式

    大神勿喷,不对的地方请指出来,学笔记而已. 解决的问题:应对多系列对象构建的变化或多系列(例如:崎岖的山路和平坦的马路属于一个系列) 不断的变化的创建. 使用场景:对象不变(比如有3个对象 " ...

  8. 设计模式02: Abstract Factory 抽象工厂(创建型模式)

    Abstract Factory 抽象工厂(创建型模式) 常见的对象创建方法:    //创建一个Road对象    Road road=new Road();    new的问题:    -实现依赖 ...

  9. Abstract Factory 抽象工厂(创建型模式)

    1.常规的对象创建方法(以更换QQ空间主题为例) (这里的常规对象指的是由于业务需求,当前实例化的对象有可能被其他相似的对象(有着共同的特性)所取代,例如更换手机铃声:一首歌取代另一首歌(词,曲,和声 ...

随机推荐

  1. 转载 | textarea 在浏览器中固定大小和禁止拖动

    HTML 标签 textarea 在大部分浏览器中只要指定行(rows)和列(cols)属性,就可以规定 textarea 的尺寸,大小就不会改变,不过更好的办法是使用 CSS 的 height 和 ...

  2. react-native-gesture-handler报错

    安装React Native第三方组件出现Task :react-native-gesture-handler:compileDebugJavaWithJavac FAILED报错,则使用jetifi ...

  3. 【0812 | Day 13】闭包函数/装饰器/迭代器

    目录 闭包函数 无参装饰器 有参装饰器 迭代器 闭包函数 一.什么是闭包? 闭包指的是:函数内部函数对外部作用域而非全局作用域的引用. def outter(): x = 1 def inner(): ...

  4. 1.2模板templates

    一.模板使用 1. 配置模板目录 如果命令行创建的项目,需要手动配置模板文件目录,如果是Pycharm创建的项目,则无需配置 在项目根目录下创建模板目录,比如叫 templates,后续开发模板文件会 ...

  5. lxml解析网页

    目录 1. 什么是lxml 2. 初次使用 3. xpath 3.2 标签定位 3.3 序列定位 3.4 轴定位 4. 实例 1. 什么是lxml lxml是干什么的?简单的说来,lxml是帮助我们解 ...

  6. React SPA 应用 hash 路由如何使用锚点

    当我们在做 SPA 应用的时候,为了兼容老的浏览器(如IE9)我们不得不放弃 HTML5 browser history api 而只能采用 hash 路由的这种形式来实现前端路由,但是因为 hash ...

  7. java线程池,工作窃取算法

    前言 在上一篇<java线程池,阿里为什么不允许使用Executors?>中我们谈及了线程池,同时又发现一个现象,当最大线程数还没有满的时候耗时的任务全部堆积给了单个线程, 代码如下: T ...

  8. aabccd统计每个字符出现的次数,结果显示{ a: 2, b: 1, c: 2, d: 1 };去掉重复的字符,使结果显示abcd

    遍历字符串的方式和遍历数组的方式有点相似,或者说就是相同的.在学习数组的遍历方法之前,可以通过for循环去遍历数组,同样,字符串也可以:字符串跟数组都有一个length的属性.下面代码奉上,个人思路! ...

  9. Vue+ElementUI项目使用webpack输出MPA

    目录 Vue+ElementUI项目使用webpack输出MPA 一. 需求分析 二. 原方案分析 三. 多页面改造3步走 四. 小结 Vue+ElementUI项目使用webpack输出MPA 示例 ...

  10. net core天马行空系列:原生DI+AOP实现spring boot注解式编程

    写过spring boot之后,那种无处不在的注解让我非常喜欢,比如属性注入@autowire,配置值注入@value,声明式事物@Transactional等,都非常简洁优雅,那么我就在想,这些在n ...