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

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

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

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

案例

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

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

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. 用 bat 文件实现 excel 周报复制

     又要写周报???? 写周报就算了每次都要改这一大堆的日期,什么鬼嘛,最骚的我还总是有的忘记改....        作为一个正儿八经的程序员,固定每周某天干重复的一件事,哦~~  这是机器人 程序应 ...

  2. Redis的分布式和主备配置调研

    目前Redis实现集群的方法主要是采用一致性哈稀分片(Shard),将不同的key分配到不同的redis server上,达到横向扩展的目的. 对于一致性哈稀分片的算法,Jedis-2.0.0已经提供 ...

  3. HelloDjango 第 07 篇:创作后台开启,请开始你的表演!

    作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 在此之前我们完成了 django 博客首页视图的编写,我们希望首页展示发布的博客文章列 ...

  4. 弃用 wget, 拥抱多线程下载 axel

    0x00 事件 对于在 Linux 的下载工具而言,比较常用的就是 wget 或者 curl,吾也一直用 wget 的方式进行网络上的资源下载.偶然发现了 axel 这个支持多线程的下载工具,试用了几 ...

  5. mybatis批量更新策略

    我们知道循环中操作db会导致连接数满,严重影响数据库性能.所以在对db进行DQL与DML时,根据业务逻辑尽量批量操作,这里我们介绍下使用mybatis批量更新mysql的两种方式. 方式一: < ...

  6. .NET World——gPRC概览

    什么是gRPC 官方的定义: gRPC is a modern open source high performance RPC framework that can run in any envir ...

  7. 帝国CMS(EmpireCMS) v7.5配置文件写入漏洞分析

    帝国CMS(EmpireCMS) v7.5配置文件写入漏洞分析 一.漏洞描述 该漏洞是由于安装程序时没有对用户的输入做严格过滤,导致用户输入的可控参数被写入配置文件,造成任意代码执行漏洞. 二.漏洞复 ...

  8. hive explode 行拆列

    创建一张表test_explode,表结构如下 表数据如下: 1.使用explode函数 select explode(friends) as friend from test_explode; 但是 ...

  9. html中video标签

    video标签: <video src="视频的后缀名是.webM/.ogg/.mp4 "></video>属性: src:用于告诉video标签需要播放的 ...

  10. GLFW+GLAD OpenGL Mac开发环境搭建

    前言 OpenGL 是什么?The Industry Standard for High Performance Graphics 这是官方解释.说白了他就是一套标准接口.对,是接口,并没有实现具体的 ...