C#设计模式--抽象工厂模式(创建型模式)
一.抽象工厂模式:
在工厂模式中具体的产品和具体的工厂是一一对应的,一个工厂只能生产一种产品,结构单一,例如小米公司刚开始是只生产小米手机,但是伴随着公司的发展,他们需要生产不同型号的手机,也会生产路由器,小米电视等等,那么工厂方法模式已不能满足业务的需求了,此时我们就需要抽象工厂模式,即一个工厂可以生产多种产品。
抽象产品:负责定义抽象工厂生成的产品的接口,在本例中有两个抽象产品类,分别是手机和电视的抽象类
- 电视(抽象类)
- watchTV
- 手机(抽象类)
- 打电话
- 电视(抽象类)
public abstract class IMobilePhone
{
public abstract void dial();
}
public abstract class ITelevision
{
public abstract void watchTV();
}
抽象产品类
- 具体产品:负责实现抽象类的产
public class MobilePhone : IMobilePhone
{
private string name;
public MobilePhone(string name)
{
this.name = name;
Console.WriteLine("制作手机"+name);
}
public override void dial()
{
Console.WriteLine("使用" + name+"打电话");
}
}
public class Television : ITelevision
{
private string name;
public Television(string name)
{
this.name = name;
Console.WriteLine("制作电视"+name);
}
public override void watchTV()
{
Console.WriteLine("通过"+name+"看电视");
}
}
具体产品类
- 抽象工厂类抽象工厂角色是负责定义用于生成抽象产品的接口
public abstract class Factory
{
public static Factory getFactory(string classname)
{ Factory factory = null;
try
{
factory = (Factory)Assembly.Load("设计模式").CreateInstance("设计模式." + classname);
}
catch (Exception e)
{
Console.WriteLine("没有找到 " + classname + "类。");
}
return factory;
}
public abstract MobilePhone createMobilePhone(String type);
public abstract Television createTelevision(String type);
}
抽象工厂类
- 具体工厂类:实现抽象工厂的抽象方法生成产品
public class XiaoMiFactory:Factory
{
public override MobilePhone createMobilePhone(string type)
{
return new MobilePhone(type);
}
public override Television createTelevision(string type)
{
return new Television(type);
}
}
具体工厂类
下面实际测试一下:
static void Main(string[] args)
{
Factory factory = Factory.getFactory("XiaoMiFactory");
IMobilePhone mobilePhone1 = factory.createMobilePhone("小米2");
IMobilePhone mobilePhone2 = factory.createMobilePhone("小米5"); ITelevision television1 = factory.createTelevision("小米电视2");
ITelevision television2 = factory.createTelevision("小米电视3"); mobilePhone1.dial();
mobilePhone2.dial(); television1.watchTV();
television2.watchTV();
Console.ReadKey();
}
输出信息:
- 制作手机小米2
- 制作手机小米5
- 制作电视小米电视2
- 制作电视小米电视3
- 使用小米2打电话
- 使用小米5打电话
- 通过小米电视2看电视
- 通过小米电视3看电视
C#设计模式--抽象工厂模式(创建型模式)的更多相关文章
- 设计模式02: Abstract Factory 抽象工厂(创建型模式)
Abstract Factory 抽象工厂(创建型模式) 常见的对象创建方法: //创建一个Road对象 Road road=new Road(); new的问题: -实现依赖 ...
- Abstract Factory 抽象工厂(创建型模式)
1.常规的对象创建方法(以更换QQ空间主题为例) (这里的常规对象指的是由于业务需求,当前实例化的对象有可能被其他相似的对象(有着共同的特性)所取代,例如更换手机铃声:一首歌取代另一首歌(词,曲,和声 ...
- 2.Abstract Factory 抽象工厂(创建型模式)之简单工厂
简单工厂 1.只有一个工厂(具体的,没有抽象) 2.只生产一种产品(抽象的产品) 3.这种产品可以有多种具体产品类型(派生) 代码实现 class Program { static void Main ...
- FactoryMethod工厂方法模式(创建型模式)
1.工厂方法模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只 ...
- Prototype原型模式(创建型模式)
1.原型模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只有一 ...
- 工厂方法模式——创建型模式02
1. 简单工厂模式 在介绍工厂方法模式之前,先介绍一下简单工厂模式.虽然简单工厂模式不属于GoF 23种设计模式,但通常将它作为学习其他工厂模式的入门,并且在实际开发中使用的也较为频繁. (1 ...
- 设计模式(五):PROTOTYPE原型模式 -- 创建型模式
1.定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 2.适用场景 原型模式的主要思想是基于现有的对象克隆一个新的对象出来,一般是有对象的内部提供克隆的方法,通过该方法返回一个对 ...
- 设计模式(二): BUILDER生成器模式 -- 创建型模式
1.定义 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式. 2.适用场景 1. 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式 ...
- java架构之路-(设计模式)五种创建型模式之单例模式
设计模式自身一直不是很了解,但其实我们时刻都在使用这些设计模式的,java有23种设计模式和6大原则. 设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可 ...
- 设计模式(一): abstract factory抽象工厂模式 -- 创建型模式
1.定义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 2.适用场景 1.一个系统要独立于它的产品创建.组合和表示. 2.一个系统要由多个产品系列中的一个来配置. 3.当你要 ...
随机推荐
- [BOI2007]Sequence 序列问题 BZOJ1345
题目描述 对于一个给定的序列a1, …, an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai和ai+1用一个元素max(ai,ai+1)替代,这样得到一个比原来序列短的新序列.这一 ...
- [转载]C#实现获取浏览器信息
原文地址:C#实现获取浏览器信息作者:flywithme Request.Browser.MajorVersion.ToString();//获取客户端浏览器的(主)版本号 Request.Bro ...
- webpack4.0入门配置文件
wepback风头正火 ,但是公司一直在用gulp,正好赶上年底活动,借此机会第一次尝试了webpack,说实话webpack真的很强大,内容一层一层递进. 这几天跟着官网跑了一遍,然后写了自己的配置 ...
- vue.js学习笔记(二)——vue-router详解
vue-router详解 原文链接:www.jianshu.com 一.前言 要学习vue-router就要先知道这里的路由是什么?为什么我们不能像原来一样直接用<a></a> ...
- Python 初识爬虫-**机场出港业务
# -*- coding:utf-8 -*- from lxml import etree import requests ##先进单页测试,然后在进行多页循环 没有解决的问题,动态解决最大页数,目前 ...
- 信息领域热词分析系统--python统计
统计词语出现的频率,并且按从高到低的顺序报错在文件中 def main(): file=open("F:\大数据\大作业\分词后的文件\data4_xinxi.txt",'r') ...
- git 的搭建与使用
公司之前用的是vpn,然后老大说让我搞一个git.于是,我开始了git的研究之路.... 概念:(说实话,看了还是有些不太理解) git 是一种版本控制系统,是一个命令,是一种工具 g ...
- Vue.js-----轻量高效的MVVM框架(十一、使用slot分发内容)
#单个slot html: <h3>#单个slot</h3> <!-- 定义child01模板 --> <template id="child01& ...
- oracle count(*) 和count(列)性能
一直以为oracle中count(列)比count(*) 快,这篇文件解释了一下: http://blog.csdn.net/szstephenzhou/article/details/8446481
- python 缺失值的处理