Abstract Factory抽象工厂模式
抽象工厂模式是是用一个超级工厂去创建其他工厂,简单点说就是工厂的父类,属于创建型模式。
目标:提供一个创建一组对象的方法,而无需指定它们具体的类(同工厂方法)。
使用场景:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
实现:在一个工厂里聚合多个同类产品。
案例
上一个工厂方法模式的案例是 一家生产电子产品的工厂,可以生产各种电子产品,但是这时候集团还拥有一家生产服装的工厂,
怎么能把这两个工厂给管理起来,其实把公产管理起来这样更加有助于去理解业务中的类的组织管理,不至于混乱不清晰。
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抽象工厂模式的更多相关文章
- c++ 设计模式9 (Abstract Factory 抽象工厂模式)
5.2 抽象工厂模式 动机:在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时,由于需求的变化,往往存在更多系列对象的创建工作. 代码示例: 实现利用数据库的业务逻辑,支持多数据库(Sq ...
- 设计模式(一): abstract factory抽象工厂模式 -- 创建型模式
1.定义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 2.适用场景 1.一个系统要独立于它的产品创建.组合和表示. 2.一个系统要由多个产品系列中的一个来配置. 3.当你要 ...
- Java设计模式:Abstract Factory(抽象工厂)模式
概念定义 抽象工厂(Abstract Factory)模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式中,系统的产品有多于一个的产品族(一个产品族里定义多个产品) ...
- 一天一个设计模式——Abstract Factory抽象工厂模式
一.模式说明 前面学习了工厂方法(Factory Method)模式.在工厂方法模式中,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类,具体的处理交由子类来处理.这里学习的抽象工厂 ...
- 面向对象设计模式纵横谈:Abstract Factory 抽象工厂模式(笔记记录)
今天是设计模式的第二讲,抽象工厂的设计模式,我们还是延续老办法,一步一步的.演变的来讲,先来看看一个对象创建的问题. 1.如何创建一个对象 常规的对象创建方法: 这样的创建对象没有任何问题, ...
- Abstract Factory 抽象工厂模式
提供一个创建一些列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂顾名思义就是对工厂的抽象,它提供了一组创建抽象产品对象的操作接口,我们实际使用的是抽象工厂的派生类,派生类中提供了操作的具 ...
- 2.设计模式-Abstract Factory 抽象工厂模式
大神勿喷,不对的地方请指出来,学笔记而已. 解决的问题:应对多系列对象构建的变化或多系列(例如:崎岖的山路和平坦的马路属于一个系列) 不断的变化的创建. 使用场景:对象不变(比如有3个对象 " ...
- 设计模式02: Abstract Factory 抽象工厂(创建型模式)
Abstract Factory 抽象工厂(创建型模式) 常见的对象创建方法: //创建一个Road对象 Road road=new Road(); new的问题: -实现依赖 ...
- Abstract Factory 抽象工厂(创建型模式)
1.常规的对象创建方法(以更换QQ空间主题为例) (这里的常规对象指的是由于业务需求,当前实例化的对象有可能被其他相似的对象(有着共同的特性)所取代,例如更换手机铃声:一首歌取代另一首歌(词,曲,和声 ...
随机推荐
- 转载 | CSS实现单行、多行文本溢出显示省略号(…)
本文引自:https://www.cnblogs.com/wyaocn/p/5830364.html 首先,要知道css的三条属性. overflow:hidden; //超出的文本隐藏 text-o ...
- 统计学习方法—SVM推导
目录 SVM 1. 定义 1.1 函数间隔和几何间隔 1.2 间隔最大化 2. 线性可分SVM 2.1 对偶问题 2.2 序列最小最优算法(SMO) 3. 线性不可分SVM 3.1 松弛变量 3.2 ...
- python案例:使用if语句实现一个猜拳游戏
任务要求: 在控制台中提示输入石头.剪刀.布,按回车键,然后给出游戏结果. 分析: 我们知道在游戏规则中,石头克剪刀,剪刀克布,布克石头.但是这在计算机中并不是很好直接的表示,因此我们分别用0.1.2 ...
- Vue 路由模块化配置
博客地址:https://ainyi.com/77 企业运营后台页面很多,路由如若不区分模块化配置,所有路由挤在同一个文件将不好维护,所以路由的配置也要模块化 分享两个解决方案 -- Vue 路由配置 ...
- poj 1286 polya定理
Necklace of Beads Description Beads of red, blue or green colors are connected together into a circu ...
- 002——Netty之Netty介绍
Netty出现背景 Java NIO难用 据说存在bug 业界其他NIO框架不成熟 Netty主要解决两个相应关注领域 (1)异步和事件驱动的实现. (2)一组设计模式,将应用逻辑与网络层解耦. 特性 ...
- Hive安装与部署
进去root权限(su) 1.从https://mirrors.tuna.tsinghua.edu.cn/apache/hive/hive-1.2.2/apache-hive-1.2.2-bin.ta ...
- spring cloud 断路器 Hystrix
一.微服务架构中使用断路器的原因 二.代码实现 1.在Ribbon中使用短路器 1.1.引入依赖 <dependency> <groupId>org.springframewo ...
- UWP实现吸顶的Pivot
话不多说,先上效果 这里使用了一个ScrollProgressProvider.cs,我们这篇文章先解析一下整体的动画思路,以后再详细解释这个Provider的实现方式. 结构 整个页面大致结构是 & ...
- 试试 python-dotenv,避免敏感信息被硬编码到代码中
我们开发的每个系统都离不开配置信息,例如数据库密码.Redis密码.邮件配置.各种第三方配置信息,这些信息都非常敏感,一旦泄露出去后果非常严重,被泄露的原因一般是程序员将配置信息和代码混在一起导致的. ...