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

目标:提供一个创建一组对象的方法,而无需指定它们具体的类(同工厂方法)。
使用场景:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
实现:在一个工厂里聚合多个同类产品。

案例

上一个工厂方法模式的案例是 一家生产电子产品的工厂,可以生产各种电子产品,但是这时候集团还拥有一家生产服装的工厂,
怎么能把这两个工厂给管理起来,其实把公产管理起来这样更加有助于去理解业务中的类的组织管理,不至于混乱不清晰。

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");}}#endregionpublic 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();}}
}

转载于:https://www.cnblogs.com/sands/p/11460160.html

Abstract Factory抽象工厂模式相关推荐

  1. 设计模式学习总结1 - 创建型1 - Abstract Factory抽象工厂模式

    AbstractFactory抽象工厂模式(创建型) 作用: 这种模式支持创建不同的对象,这些对象功能接近且一般都是在一起创建的.抽象工厂被具体化成不同的工厂来创建类似产品的不同产品.这种模式将类于使 ...

  2. 笔记:设计模式(3)-Abstract Factory抽象工厂模式

      工厂模式的起源 1.变化点在"对象的创建",因此就封装"对象创建": 2.面向接口编程,依赖接口,而非依赖实现. 动机(Motivation) 在系统中,经 ...

  3. Java 设计模式之 Abstract Factory 抽象工厂模式

    在工厂方法基础上,将工厂的生产方法的返回类型从具体产品抽象为抽象产品,同时扩展工厂的方法,支持任意定制产品族,则工厂方法可以升级为抽象工厂模式,比如一家餐厅可以提供牛排(方法A),红酒(方法B),蔬菜 ...

  4. 09Abstract Factory(抽象工厂)模式

    技术交流QQ群:1027579432,欢迎你的加入! 1.Abstract Factory(抽象工厂)模式动机 在软件系统中,经常面临着一系列相互依赖的对象的创建工作.同时,由于需求的变化,往往存在更 ...

  5. 设计模式之抽象工厂模式(Abstract Factory)摘录

    面向对象系统的分析和设计实际上追求的就是两点:高内聚(Cohesion)和低耦合(Coupling). 23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.Fa ...

  6. 应用抽象工厂模式自己动手写一个ioc

    本文的作者Danny hui似乎是TTS上的新人,我从Google搜不出一点关于本人的信息.从通过本文可以看出他对模式与IoC有自己独到的见解,本文在TTS上引发很多网友回帖,反响不一.那么我们现在来 ...

  7. 【设计模式】之抽象工厂模式

    创造性设计模式 创造型模式主要是为了实例化类所用.进一步又分为类创建.对象创建模式. 类创建模式 类创建模式主要基于继承方式进行实例化 对象创建模式 对象创建模式主要基于委托机制进行实例化 Abstr ...

  8. 抽象工厂模式,工厂方法模式区别

    抽象工厂模式 转载自:https://www.shiyanlou.com/courses/document/867 一.本节目标 我们本节课程主要介绍[抽象工厂模式]的相关知识,将会涉及以下内容: 什 ...

  9. 【Python】设计模式(2)--抽象工厂模式

    抽象工厂模式 亦称: Abstract Factory 意图 抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类. 问题 假设你正在开发一款家具商店模拟器. 你的代码中 ...

最新文章

  1. gd-flags |= GD_FLG_RELOC; 问题遗留
  2. CodeForces - 1353D Constructing the Array(bfs)
  3. Shell编程关于Sha-Bang(#!)
  4. javascript中的字符串和数组的互转
  5. MVVM和MVC有什么区别
  6. VMware vSphere 6.5配置系列
  7. cssd oracle,Oracle RAC /etc/init.d/init.cssd startcheck
  8. SpringBoot整合Cas
  9. 计算机网络系统是由计算机系统,计算机网络由哪几部分组成?
  10. 微信小程序——获取当前人微信绑定的手机号码
  11. egret可以用php做后端吗,Egret引擎开发指南之发布项目_node.js
  12. 评价类模型---TOPSIS法
  13. ACM训练史上最详细计划(大神养成记)
  14. matlab ilu函数,不完全 LU 分解
  15. HCIP之OSPF(五)
  16. SPSS随机对照研究总结
  17. 爬虫:python如何获得天气数据
  18. 百度云智峰会 百度智能大数据助力医学、金融领域变革
  19. ElasticSearch实战篇 - Spring Boot 整合 ElasticSearch
  20. 2022/9/3——qt中实现调色板

热门文章

  1. python中str和repr_python中str()和repr()函数的区别
  2. 工厂方法模式(Factory Method)简介
  3. yar java_Yar 的传输协议学习以及 Java 版本的实现
  4. L2-004 这是二叉搜索树吗?-团体程序设计天梯赛GPLT
  5. eclipse打包项目为aar_Eclipse中使用AAR
  6. 盘点 2022 云原生实战峰会产品发布
  7. 因你不同,2021 阿里云开发者大会重磅开启 @ 所有开发者!
  8. Knative 基于流量的灰度发布和自动弹性实践
  9. Mysql多表查询(案例2)
  10. 马来西亚国立大学的计算机,要拿到马来西亚国立大学的 offer难吗?