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 ...
随机推荐
- 2017ICPC南宁M The Maximum Unreachable Node Set (偏序集最长反链)
题意:给你一张DAG,让你选取最多的点,使得这些点之间互相不可达. 思路:此问题和最小路径可重复点覆盖等价,先在原图上跑一边传递闭包,然后把每个点拆成两个点i, i + n, 原图中的边(a, b)变 ...
- 创建entityManager
1 需要persistence.xml 完全通过属性配置没成功 <persistence xmlns="http://java.sun.com/xml/ns/persistence&q ...
- 阿里云轻应用云服务器配置tomcat
#etc/profile export CATALINA_HOME=/wocloud/tomcat_cluster/tomcat1/apache-tomcat-7.0.57 #查看防火墙状态 fire ...
- jQuery ajax上传文件实例
jQuery ajax上传文件实例 <form id="form" enctype="multipart/form-data"><input ...
- ArrayList,Vector, LinkedList的存储性能和特性?
ArrayList,Vector, LinkedList的存储性能和特性? ArrayList 采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,所以最大的缺点就是插入或删除时非常麻烦. ...
- Cobaltstrike系列教程(一)-简介与安装
0x001-Cobaltstrike简介 Cobalt Strike是一款美国Red Team开发的渗透测试神器,常被业界人称为CS.这款神器许多大佬们都已经玩的很6,我一个菜鸡玩的略有心得,因此写一 ...
- Java中的栈和队列
栈: public class Stack<E> extends Vector<E> { // 使用数组实现栈 // 构造一个空栈 public Stack() { } // ...
- php substr_count()函数 语法
php substr_count()函数 语法 作用:统计一个字符串,在另一个字符串中出现次数大理石量具 语法:substr_count(string,substring,start,length) ...
- postgresql主从同步配置
前言 不久前,公司的一台物理机器硬件坏了,导致运行在其上的虚拟机都挂了.很不凑巧的是,我负责的那台虚拟机的系统盘坏了(ps:感觉老天在玩我),导致里面的数据永远的离我而去(ps:当时我的内心是崩溃的) ...
- 电脑如何连接windows server服务器
第一步:win+r 启动‘运行’,输入mstsc 第二步:连接远程桌面,输入服务器ip 第三步,输入账户密码,登陆即可. 注释:mstsc,全称 Microsoft Telnet Screen Con ...