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空间主题为例) (这里的常规对象指的是由于业务需求,当前实例化的对象有可能被其他相似的对象(有着共同的特性)所取代,例如更换手机铃声:一首歌取代另一首歌(词,曲,和声 ...
随机推荐
- Netty学习(九)-Netty编解码技术之Marshalling
前面我们讲过protobuf的使用,主流的编解码框架其实还有很多种: ①JBoss的Marshalling包 ②google的Protobuf ③基于Protobuf的Kyro ④Apache的Thr ...
- nodeJs跨域设置(express,koa2,eggJs)
原生跨域 var http=require('http'); var server = http.createServer(function (req,res) { res.setHeader('Ac ...
- android ——活动
活动(Activity)主要用于和用户进行交互,是一种可以包含用户界面的组件. 1.手动创建活动 右击com.example.administrator.exp5→New→Activity→Empty ...
- laravel新项目报错 No application encryption key has been specified.
解决办法, 若文件根目录下没有 .env 1..env.example 改名使用命令 copy 修改为 .env 2.使用命令 php artisan key:generate 获取密码,自动保存到 ...
- php 中session_set_cookie_params 和 setcookie 函数的区别与用法
session_set_cookie_params() 函数不管刷不刷新页面,都不会改变cookie的过期时间, 但setcookie() 函数页面每刷新一次,cookie 的过期时间就会刷新一次. ...
- 【Aizu - 2249】Road Construction(最短路 Dijkstra算法)
Road Construction Descriptions Mercer国王是ACM王国的王者.他的王国里有一个首都和一些城市.令人惊讶的是,现在王国没有道路.最近,他计划在首都和城市之间修建道路, ...
- 【JVM从小白学成大佬】开篇
JVM的重要性毋庸置疑,可以毫不夸张的说Java虚拟机是整个Java平台的基石. JVM方面的知识,也一直是BAT等大厂面试考核的重点.特别是JVM调优,故障排查性能调优,你知道该从哪些方面入手吗? ...
- Spring学习之旅(九)--SpringMVC高级技术
文件上传 在 Web 应用中,允许用户上传文件是很常见的需求.文件上传通常是采用 multipart 格式,而 DispatcherServlet 并没有任何解析 multipart 请求数据的功能, ...
- React生命周期函数理解
一.组件挂载阶段 1. componentWillMount() 该方法在首次渲染之前调用,在一个组件挂载到卸载的过程中,仅仅执行这一次.该函数内可以state初始化的工作,与constructor的 ...
- redis数据结构、持久化、缓存淘汰策略
Redis 单线程高性能,它所有的数据都在内存中,所有的运算都是内存级别的运算,而且单线程避免了多线程的切换性能损耗问题.redis利用epoll来实现IO多路复用,将连接信息和事件放到队列中,依次放 ...