C#设计模式:抽象工厂(Abstract Factory)
一,抽象工厂模式
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace _3._1抽象工厂
{ //如果一个工厂模式提供上衣和裤子,那么他属于工厂方法模式;
//如果一个工厂模式提供棉袄上衣,休闲裤子,秋装上衣和西装裤子,那么这个工厂模式就是抽象工厂模式,因为他提供的产品是不同的等级结构的产品比如棉袄上衣和秋装上衣,就是不同等级的产品结构,而X码上衣和L码上衣则是属于相同等级的产品结构 //在抽象工厂模式中,有一个产品族的概念:所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族,就比如棉袄上衣和秋装上衣是属于一个产品族,但是这两个是不同等级结构产品,但是产品之间有相互依赖、或作用的关系,从而组成人身上的一部分
//抽象工厂模式所提供的一系列产品就组成一个产品族(棉袄上衣,休闲裤子,秋装上衣和西装裤子);而工厂方法提供的一系列产品称为一个等级结构(只有上衣和裤子)。
class Program
{
static void Main(string[] args)
{
IPeopleFactory chinepeople1 = new ChinePeopleFactory();
string Clothes1 = chinepeople1.CreateClothes().show("X码");
string Shoes1 = chinepeople1.CreateShoes().show("32码");
Console.WriteLine("中国人穿了" + Clothes1 + "," + Shoes1); IPeopleFactory usapeople = new USAPeopleFactory();
string Clothes2 = usapeople.CreateClothes().show("X码");
string Shoes2 = usapeople.CreateShoes().show("32码");
Console.WriteLine("美国人穿了" + Clothes2 + "," + Shoes2); Console.ReadKey();
}
}
public interface IClothes
{
string show(string type);
}
public interface IShoes
{
string show(string type);
} public class ChineClothes : IClothes
{
public string show(string type)
{
return type + "棉袄上衣";
}
}
public class ChineShoes : IShoes
{
public string show(string type)
{
return type + "休闲裤子";
}
}
public class USAClothes : IClothes
{
public string show(string type)
{
return type + "秋装上衣";
}
}
public class USAShoes : IShoes
{
public string show(string type)
{
return type + "西装裤子";
}
} public interface IPeopleFactory
{
IClothes CreateClothes();
IShoes CreateShoes();
}
public class ChinePeopleFactory : IPeopleFactory
{
public IClothes CreateClothes()
{
return new ChineClothes();
}
public IShoes CreateShoes()
{
return new ChineShoes();
}
}
public class USAPeopleFactory : IPeopleFactory
{
public IClothes CreateClothes()
{
return new USAClothes();
}
public IShoes CreateShoes()
{
return new USAShoes();
}
}
}
二,抽象工厂和工厂模式的区别:
1,是针对的多个产品(对象)等级结构,而工厂模式是针对单个产品(对象)结构,而这些产品(对象)之间有相互依赖、或作用的关系
三,那这里的多个产品(对象)和产品(对象)之间相互依赖关系怎么理解呢?
1》产品(对象)理解:比如以上的代码例子,我们存在人,是需要鞋子和衣服的,而这里的鞋子和衣服属于工厂内的产品(对象)
单个产品(对象)等级结构的理解:在工厂模式中,我们的每个人的鞋子和衣服都是相同的,所以我们的鞋子和衣服是属于单个产品(对象)等级结构
多个产品(对象)等级结构的理解:在抽象工厂模式中,我们的每个人的鞋子和衣服都是不同的,比如有一个人需要棉袄上衣和休闲裤子,而另一个人则需要秋装上衣和西装裤子,产品(对象)等级结构出现了差异,所以是不同产品等级结构,这是就出现了多个产品(对象)等级结构,所以组成了一个产品族的概念
PS: 当有多个不同的等级结构的产品时,如果使用工厂方法模式就势必要使用多个独立的工厂等级结构来对付这些产品的等级结构。如果这些产品等级结构是平行的,会导致多个平行的工厂等级结构。
2》那什么是产品族?
产品族是指上衣这样的大类,而产品则是属于产品族这一大类的,而属于这一大类的许多产品合成一个产品族,也是系列对象的组成抽象工厂模式
3》产品(对象)之间相互依赖关系
产品直接都是存在依赖关系,比如棉袄上衣和休闲裤子组成人的一部分
C#设计模式:抽象工厂(Abstract Factory)的更多相关文章
- 设计模式——抽象工厂(Abstract Factory)
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类. ——DP UML类图 模式说明 抽象工厂与工厂方法在定义上最明显的区别是“创建一系列相关或相互依赖对象的接口”,由此可以看出抽象工 ...
- 抽象工厂(Abstract Factory),工厂方法(Factory Method),单例模式(Singleton Pattern)
在谈工厂之前,先阐述一个观点:那就是在实际程序设计中,为了设计灵活的多态代码,代码中尽量不使用new去实例化一个对象,那么不使用new去实例化对象,剩下可用的方法就可以选择使用工厂方法,原型复制等去实 ...
- 面向对象设计——抽象工厂(Abstract Factory)模式
定义 提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类.抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道或关心实际产出的具体产品是什么.这样一来,客户就能从具体的产 ...
- 设计模式四: 抽象工厂(Abstract Factory)
简介 抽象工厂模式是创建型模式的一种, 与工厂方法不同的是抽象工厂针对的是生产一组相关的产品, 即一个产品族. 抽象工厂使用工厂方法模式来生产单一产品, 单一产品的具体实现分别属于不同的产品族. 抽象 ...
- 【设计模式】——抽象工厂Abstract Factory
模式意图 提供对象的使用接口,隐藏对象的创建过程. 模式结构 AbstractFactory 提供创建对象的接口. ConcreteFactory 提供真正创建对象的实现类,用于组合并创建不同的对象, ...
- 5、抽象工厂 abstract factory 将关联组件组成产品 创建型模式
趁热打铁,紧跟着上一节的工厂方法模式.这一节介绍一下抽象工厂模式,以及分析俩个模式的不同 1.何为抽象模式? 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他 ...
- 工厂模式[3] 抽象工厂 Abstract Factory
简介 1.简单工厂,或静态工厂,产品接口 定义:专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类或实现同一接口 优点:客户端可以直接消费产品,而不必关心具体产品的实现(不关心对象的 ...
- C2:抽象工厂 Abstract Factory
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 应用场景: 一系列相互依赖的对象有不同的具体实现.提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合 UM ...
- Java 工厂模式(一)— 抽象工厂(Abstract Factory)模式
一.抽象工厂模式介绍: 1.什么是抽象工厂模式: 抽象工厂模式是所有形态的工厂模式中最为抽象和最具有一般性的一种形态,抽象工厂模式向客户端提供一个接口,使得客户端在不知道具体产品的情类型的情况下,创建 ...
- Headfirst设计模式的C++实现——抽象工厂(Abstract Factory)
Dough.h #ifndef _DOUGH_H #define _DOUGH_H class Dough { }; #endif ThinCrustDough.h #ifndef _THIN_CRU ...
随机推荐
- 脚本_修改 Linux 系统的最大打开文件数量
#!bin/bash#作者:liusingbon#功能:修改 Linux 系统的最大打开文件数量#追加两行配置参数到文件/etc/security/limits.conf的末尾,修改最大打开文件数量为 ...
- linux --memcached的安装与配置
转载:http://blog.sina.com.cn/s/blog_4829b9400101piil.html 1.准备安装包:libevent-2.0.21-stable.tar.gz 和memca ...
- ps:点阵格式图像
我们所看到的图像,究竟是如何构成的呢?这就需要涉及到图像类型的概念. 电脑中的图像类型分为两大类,一类称为点阵图,一类称为矢量图. 点阵图顾名思义就是由点构成的,如同用马赛克去拼贴图案一样,每个马赛克 ...
- django之类视图
一:类视图 1. 为什么使用类视图? # 以注册请求逻辑为例 def register(request): if request.method == "GET": render(r ...
- python的次方操作
好简单,不需要import任何包 b=a**n就是求a的n次方,如果n=0.5就是开方 如果开方的是负数或者附复数,需要 import math b=math.sqrt(a) 这样
- SystemUI分析
SystemUI是安卓的一个系统APP,负责的内容有系统通知栏,状态栏,最近应用程序,锁屏,壁纸,屏保,系统对话框,截屏,录屏等功能. Apk的路径位于/system/priv-app,源码code位 ...
- C++指针的指针和指针的引用
https://www.cnblogs.com/li-peng/p/4116349.html
- 学习日记13、ajax同时提交from表单和多个参数
if ($("form").valid()) { $.ajax({ url: "@Url.Action("EditCusAndCusCard")&qu ...
- spring管理的事务
之前对spring的事务传播机制没有概念,花点时间去看了事务的源码,以及这些事务传播机制使用的文档,在此做一下简单的笔记 正文 下面说提到的共享事务的意思就是几个service共用同一个事务,如传播机 ...
- 在Mac OS X 10.11 EI Capitan 中提取iso镜像
到Apple store上下载最新的OS X El Capitan ,下载完成后就可以进行iso镜像提取操作了. 步骤一:挂载El Capitan 的安装镜像文件 1 hdiutil attach / ...