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性能优化从入门到实战:07 CPU篇:CPU性能优化方法
性能优化方法论 动手优化性能之前,需要明确以下三个问题: (1)如何评估性能优化的效果? 确定性能的量化指标.测试优化前的性能指标.测试优化后的性能指标. 量化指标的选择.至少要从应用程序 ...
- gbase整合mybatis出现: Cause: java.sql.SQLException: Can't convert to: binary stream
参考地址:http://mybatis-user.963551.n3.nabble.com/Map-SQL-Type-LVARCHAR-x-to-JDBC-Type-VARCHAR-globally- ...
- man fdisk
FDISK(8) Linux Programmer?. Manual/Linux程序手册 FDISK(8) NAME/名称 fdisk - Partition ta ...
- [BZOJ] 书堆
问题描述 蚂蚁是勤劳的动物,他们喜欢挑战极限?现在他们迎来了一个难题!蚂蚁居住在图书馆里,图书馆里有大量的书籍.书是形状大小质量都一样的矩形.蚂蚁要把这些书摆在水平桌子的边緣.蚂蚁喜欢整洁的布置,所以 ...
- nginx之访问静态文件
如何配置nginx,访问服务器上的静态文件? 1.在目录/data/interface_test下创建静态文件queryAppData.json,内容如下: 如何访问该文件呢? 2.修改/usr/lo ...
- 575 div 3 C. Robot Breakout
C. Robot Breakout 题目大意: 一堆机器人,已知他们的初始位置(x,y),本来都可以向四个方向移动,但是一些原因,一个机器人的不能向某些方向移动,该方向能移动用1表示,否则用0 求他们 ...
- JS replace方法
var str = '1abc2defg3hijk'; str.replace(/\d/g,function(a,b,c,d){ console.log("a:",a);// 匹配 ...
- 牛客网暑期ACM多校训练营(第五场) F - take —— 期望+树状数组+逆元
看到一篇好的博客特意转出来观摩大佬:转:https://blog.csdn.net/greybtfly/article/details/81413526 题目大意:给n个箱子排成一排,从头到尾按顺序依 ...
- HDU6719 Strassen(__int128)
HDU6719 Strassen 直接照题目模拟,数据范围最大不会超过__int128. 时间复杂度为 \(O(\log n)\) . #include<bits/stdc++.h> us ...
- 洛谷P1441 砝码称重(搜索,dfs+dp)
洛谷P1441 砝码称重 \(n\) 的范围为 \(n \le 20\) ,\(m\) 的范围为 \(m \le 4\) . 暴力遍历每一种砝码去除情况,共有 \(n^m\) 种情况. 对于剩余砝码求 ...