【C#设计模式-抽象工厂模式】
一.抽象工厂模式的定义:
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
二.抽象工厂模式的结构:
抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。
抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。
应用场景:一个生产集团,在北京的工厂需要生产A类汽车,A类电视;在上海的工厂需要生产B类汽车,A类电视。而在广州的工厂需要生产C类汽车,C类电视。
我们可以使用抽象工厂,抽象出工厂类,和产品类,然后继承工厂类,生产所需要的具体产品类型,产品继承抽象出来的产品,实现里面的行为方法。
1.我们抽象出Car产品和TV产品:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace ProductEntity
- {
- /// <summary>
- /// 抽象汽车产品
- /// </summary>
- public abstract class Car
- {
- public abstract void Build();
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace ProductEntity
- {
- /// <summary>
- /// 抽象TV产品
- /// </summary>
- public abstract class TV
- {
- public abstract void work();
- }
- }
2.继承自抽象出来的产品类,实现里面的方法,成为具体产品:这里只举例Acar和TVA的,后面的Bcar,Ccar,TVB,TVC,类似。
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace ProductEntity
- {
- public class CarA:Car
- {
- public override void Build()
- {
- Console.WriteLine("CarA");
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace ProductEntity
- {
- public class TVA : TV
- {
- public override void work()
- {
- Console.WriteLine("TVA");
- }
- }
- }
3.抽象出工厂类,里面有待实现创建产品的方法:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using ProductEntity;
- namespace FactoryMeth
- {
- /// <summary>
- /// 抽象生产工厂
- /// </summary>
- public abstract class AbstractFactory
- {
- /// <summary>
- /// 生产TV产品
- /// </summary>
- /// <returns></returns>
- public abstract TV newTV();
- /// <summary>
- /// 生产Car类产品
- /// </summary>
- /// <returns></returns>
- public abstract Car newCar();
- }
- }
4.创建具体的工厂类,继承自抽象出来的工厂,实现里面创建具体产品的方法。例:后面的B工厂,和C工厂类似实现。
- using ProductEntity;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace FactoryMeth
- {
- /// <summary>
- /// A工厂
- /// </summary>
- public class AbstractFactoryA:AbstractFactory
- {
- /// <summary>
- /// 生产A品牌电视
- /// </summary>
- /// <returns></returns>
- public override TV newTV()
- {
- return new TVA();
- }
- /// <summary>
- /// 生产A品牌汽车
- /// </summary>
- /// <returns></returns>
- public override Car newCar()
- {
- return new CarA();
- }
- }
- }
- using ProductEntity;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace FactoryMeth
- {
- /// <summary>
- /// B工厂生
- /// </summary>
- public class AbstractFactoryB:AbstractFactory
- {
- /// <summary>
- /// 生产B品牌电视
- /// </summary>
- /// <returns></returns>
- public override TV newTV()
- {
- return new TVB();
- }
- /// <summary>
- /// 生产A品牌汽车
- /// </summary>
- /// <returns></returns>
- public override Car newCar()
- {
- return new CarA();
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using ProductEntity;
- namespace FactoryMeth
- {
- public class AbstractFactoryC:AbstractFactory
- {
- /// <summary>
- /// 生产C品牌电视
- /// </summary>
- /// <returns></returns>
- public override TV newTV()
- {
- return new TVC();
- }
- /// <summary>
- /// 生产C品牌汽车
- /// </summary>
- /// <returns></returns>
- public override Car newCar()
- {
- return new CarC();
- }
- }
- }
5.调用,根据具体情况进行选择,现在是在哪一个工厂,就创建该工厂:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using FactoryMeth;
- using ProductEntity;
- namespace 抽象工厂模式
- {
- class Program
- {
- static void Main(string[] args)
- {
- AbstractFactory factorysubA = new AbstractFactoryA();
- TV t = factorysubA.newTV();
- Car c = factorysubA.newCar();
- Console.WriteLine("A工厂生产:");
- t.work();
- c.Build();
- AbstractFactory factorysubB = new AbstractFactoryB();
- t = factorysubB.newTV();
- c = factorysubB.newCar();
- Console.WriteLine("B工厂生产:");
- t.work();
- c.Build();
- AbstractFactory factorysunC = new AbstractFactoryC();
- t = factorysunC.newTV();
- c = factorysunC.newCar();
- Console.WriteLine("C工厂生产:");
- t.work();
- c.Build();
- Console.Read();
- }
- }
- }
总结:以后如果该集团需要增加新的工厂,制造其他类型的产品,就只需要增加具体工厂类,和产品类,并实现具体产品即可。
其实工厂和抽象工厂没有多大区别,只不过是抽象工厂生产的商品是多个而已
通俗的说,就是抽象工厂模式的具体工厂里面会有多个实例具体对象的方法
更直观的就是,抽象工厂模式每个工厂一次造多个产品,而工厂模式的每个工厂只造一个产品
【C#设计模式-抽象工厂模式】的更多相关文章
- 设计模式——抽象工厂模式及java实现
设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...
- 5. 星际争霸之php设计模式--抽象工厂模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- JAVA设计模式--抽象工厂模式
抽象工厂设计模式 1.系统中有多个产品族,而系统一次只可能消费其中一族产品2.同属于同一个产品族的产品以其使用.来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的 ...
- 深入浅出设计模式——抽象工厂模式(Abstract Factory)
模式动机在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法.但是有时候我们需要一个工厂可 ...
- 24种设计模式--抽象工厂模式【Abstract Factory Pattern】
女娲造人,人是造出来了,世界是热闹了,可是低头一看,都是清一色的类型,缺少关爱.仇恨.喜怒哀乐等情绪,人类的生命太平淡了,女娲一想,猛然一拍脑袋,忘记给人类定义性别了,那怎么办?抹掉重来,然后就把人类 ...
- C++设计模式——抽象工厂模式
问题描述 之前讲到了C++设计模式——工厂方法模式,我们可能会想到,后期产品会越来越多了,建立的工厂也会越来越多,工厂进行了增长,工厂变的凌乱而难于管理:由于工厂方法模式创建的对象都是继承于Produ ...
- 设计模式 | 抽象工厂模式(abstract factory)
定义: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类. 结构:(书中图,侵删) 这个图相对来说有一点点复杂,其实就是在工厂方法模式的基础上做了一些扩展,工厂方法模式只用于生成一种 ...
- 设计模式 — 抽象工厂模式(Abstract Factory)
工厂模式已经分析了简单工厂模式和工厂方法模式.并且了解了工厂方法模式去简单工厂模式的延伸,工厂方法模式如果不把工厂类抽象的话,就是简单工厂模式.由前面两个工厂模式可以猜测出抽象工厂模式应该是这两种工厂 ...
- 设计模式--抽象工厂模式C++实现
抽象工厂模式C++实现 1定义 为创建一组相关或者依赖的对象提供一个接口,且无需指定他们的具体类 2类图 3实现 class AbstractProduct { protected: Abstract ...
- C#设计模式--抽象工厂模式(创建型模式)
一.抽象工厂模式: 在工厂模式中具体的产品和具体的工厂是一一对应的,一个工厂只能生产一种产品,结构单一,例如小米公司刚开始是只生产小米手机,但是伴随着公司的发展,他们需要生产不同型号的手机,也会生产路 ...
随机推荐
- .Net桌面程序自动更新NAppUpdate
自动更新介绍 我们做了程序,不免会有版本升级,这就需要程序有自动版本升级的功能.应用程序自动更新是由客户端应用程序自身负责从一个已知服务器下载并安装更新,用户唯一需要进行干预的是决定是否愿意现在或以后 ...
- 定时任务 Wpf.Quartz.Demo.2
定时任务 Wpf.Quartz.Demo.1已经能运行了,本节开始用wpf搭界面. 准备工作: 1.界面选择MahApp.Metro 在App.xaml添加资源 <Application.Res ...
- 【vue】项目编译报错‘npm ERR! **@**dev: `webpack-dev-server --inline --progress --config ’’
关于npm ERR! **@**dev: `webpack-dev-server --inline --progress --config‘ 原因:这是新版webpack存在的BUG,卸载现有的新版本 ...
- leetcode 152. 乘积最大子序列 java
题目: 给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6. ...
- 预防和避免死锁的方法及银行家算法的java简单实现
预防死锁 (1) 摒弃"请求和保持"条件 基本思想:规定所有进程在开始运行之前,要么获得所需的所有资源,要么一个都不分配给它,直到所需资源全部满足才一次性分配给它. 优点:简单.易 ...
- Nginx 负载均衡和反向代理实践
nginx 以哪个配置文件启动 Nginx 负载均衡和反向代理实践 环境介绍 192.168.1.50 在这台主机上配置Nginx 的反向代理,负载均衡,和web1,web1使用的81号端口 1 ...
- 设计模式《JAVA与模式》之命令模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述命令(Command)模式的: 命令模式属于对象的行为模式.命令模式又称为行动(Action)模式或交易(Transaction)模式. ...
- h5文字超出,两行显示,超出显示省略号
最近接到一个需求,要求商场导航里的文字最多显示两行,超出两行的省略号显示,查一些资料,又根据自己的需求,改了很多,直接上代码吧 <html> <head> <style ...
- IQueryable与IEnumerable
IEnumerable: 从服务器处取回所有数据,在客户端根据过滤条件进行过滤再返回结果. IQueryable: 从服务器处进行过滤,直接返回过滤后的结果.
- 剑指offer九之变态跳台阶
一.题目 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 二.思路 1.关于本题,前提是n个台阶会有一次n阶的跳法.分析如下: f(1) ...