一、产生背景

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

主要解决:主要解决接口选择的问题。

二、通常做法

在一个产品族里面,定义多个产品。创建工厂的工厂,先产生相应的工厂,再由工厂产生产品。

三、实例

1、构建第一个接口和类

namespace AbstractFactory
{
public interface IShape
{
void draw();
}
} class Circle:IShape
{
public void draw()
{
Console.WriteLine("Inside Circle::draw() method.");
}
}
.
.
.

2、构建第二个接口和类

namespace AbstractFactory
{
public interface IColor
{
void fill();
}
}

public class Blue:IColor
{
public void fill()
{
Console.WriteLine("fill blue color");
}
}


3、创建工厂

namespace AbstractFactory
{
public class ColorFactory:AbstractFactory
{ public override IShape GetShape(string shapeType)
{
return null;
} public override IColor GetColor(string color)
{
if (color == null)
{
return null;
}
if (color.Equals("red"))
{
return new Red();
}
else if (color.Equals("green"))
{
return new Green();
}
else if (color.Equals("blue"))
{
return new Blue();
}
return null;
}
}
} namespace AbstractFactory
{
public class ShapeFactory:AbstractFactory
{
public override IShape GetShape(string shapeType)
{
if (shapeType == null)
{
return null;
}
if (shapeType.Equals("circle"))
{
return new Circle();
}
else if (shapeType.Equals("rectangle"))
{
return new Rectangle();
}
else if (shapeType.Equals("square"))
{
return new Square();
}
return null;
} public override IColor GetColor(string color)
{
return null;
} }
}

4、产生工厂的工厂

    public class FactoryProducer
{
public static AbstractFactory GetFactory(string choice)
{
if (choice.Equals("shape"))
{
return new ShapeFactory();
}
else if (choice.Equals("color"))
{
return new ColorFactory();
}
return null;
}
}

5、应用

    class Program
{
static void Main(string[] args)
{
//获取形状工厂
AbstractFactory shapeFactory = FactoryProducer.GetFactory("shape"); //获取形状为 Circle 的对象
IShape shape1 = shapeFactory.GetShape("circle");
//调用 Circle 的 draw 方法
shape1.draw(); //获取形状为 Rectangle 的对象
IShape shape2 = shapeFactory.GetShape("rectangle");
//调用 Rectangle 的 draw 方法
shape2.draw(); //获取形状为 Square 的对象
IShape shape3 = shapeFactory.GetShape("square");
//调用 Square 的 draw 方法
shape3.draw(); //获取颜色工厂
AbstractFactory colorFactory = FactoryProducer.GetFactory("color"); //获取颜色为 Red 的对象
IColor color1 = colorFactory.GetColor("red");
//调用 Red 的 fill 方法
color1.fill(); //获取颜色为 Green 的对象
IColor color2 = colorFactory.GetColor("green");
//调用 Green 的 fill 方法
color2.fill(); //获取颜色为 Blue 的对象
IColor color3 = colorFactory.GetColor("blue");
//调用 Blue 的 fill 方法
color3.fill(); Console.ReadLine();
}
}

四、设计模式分析

优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

点击下载源码

设计模式のAbstractFactory(虚拟工厂)----创建模式的更多相关文章

  1. 桥接模式及C++实现 C++设计模式-AbstractFactory抽象工厂模式

    桥接模式及C++实现 桥接模式 先说说桥接模式的定义:将抽象化(Abstraction)与实现化(Implementation)分离,使得二者可以独立地变化. 桥接模式号称设计模式中最难理解的模式之一 ...

  2. C#设计模式之二工厂方法模式(Factory Method Pattern)【创建型】

    一.引言 在上一篇文章中我们讲解了过渡的一种模式叫做[简单工厂],也有叫[静态工厂]的,通过对简单工厂模式得了解,我们也发现了它的缺点,就是随着需求的变化我们要不停地修改工厂里面的方法的代码,需求变化 ...

  3. C++设计模式-AbstractFactory抽象工厂模式

    AbstractFactory 要创建一组相关或者相互依赖的对象 作用:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. UML结构图: 抽象基类: 1)AbstractProdu ...

  4. [设计模式]<<设计模式之禅>>工厂方法模式

    1 女娲造人的故事 东汉<风俗通>记录了一则神话故事:“开天辟地,未有人民,女娲搏黄土做人”,讲述的内容就是大家非常熟悉的女娲造人的故事.开天辟地之初,大地上并没有生物,只有苍茫大地,纯粹 ...

  5. 重学 Java 设计模式:实战工厂方法模式

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!

  6. IOS设计模式浅析之工厂方法模式(Factory Method)

    概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口. 如何隔离出这个易变对象的变化,使得系统中“其它依赖该对象的对 ...

  7. java设计模式-----2、工厂方法模式

    再看工厂方法模式之前先看看简单工厂模式 工厂方法模式(FACTORY METHOD)同样属于一种常用的对象创建型设计模式,又称为多态工厂模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的 ...

  8. 设计模式C++实现——工厂方法模式

    模式定义: 工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个. 工厂方法让类把实例化推迟到子类. 模式结构: Creator是一个类,它实现了全部操纵产品的方法,但不实现工厂方法 ...

  9. Java描述设计模式(03):工厂方法模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.工厂方法模式 1.生活场景 系统常见的数据导出功能:数据导出PDF.WORD等常见格式. 2.工厂方法模式 是类的创建模式,又叫做虚拟构造 ...

  10. 大话设计模式Python实现-工厂方法模式

    工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延时到其子类. #!/usr/bin/env python ...

随机推荐

  1. linux中make的用法

    一.linux中make的用法 目的:       基本掌握了make 的用法,能在Linux系统上编程.环境:       Linux系统准备:       准备三个文件:file1.c, file ...

  2. 价值1.35亿美元的BUG

    价值1.35亿美元的BUG 译者按: 一横值千金啊! 原文: Mariner 1’s $135 million software bug 译者: Fundebug 为了保证可读性,本文采用意译而非直译 ...

  3. js控制随机数生成概率代码实例

    基本思路:把Math.random()js随机数生成的数看着百分比,然后定义每个整数值取值范围. 具体内容如下,供大家参考 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

  4. angular ng-repeat出来的数据 每条修改数据后返回给接口 如何取到每个对应修改的值

    接口结构 $scope.DataList = [ { "dataA":"numA", "dataB":"numB"a } ...

  5. js 金额补全处理

    function returnFloat(value) { var value = Math.round(parseFloat(value) * 100) / 100; var xsd = value ...

  6. H5+混合移动app应用开发——app升级

    当我们的app开发完成之后,无可避免的以后会进行产品升级,那么我们希望在客户的手机上让app进行自动升级,可以分为自动升级和手动升级. 自动升级:一般在客户app第一次打开首页的时候. 手动升级:在a ...

  7. Python变量和简单数据类型

    变量的命名和使用 在Python中使用变量时 ,需要遵守一定的规则和指南. 变量名只能包含字母‘数字和下划线 变量名不能包含空格,但可以用下划线分割其中单词 不要将Python关键字和函数名用作变量名 ...

  8. linux文件统计命令和目录统计命令

    1.统计本目录下除`./apps/myapp/migrations`的所有py文件 wc -l `find -path . -o -name '*py' ! -path "./apps/my ...

  9. spring mvc 中 controller 路径配置

    下图中,由于红色部分(value="/")的存在,导致 host:port/项目/dimlist 无法被映射到dimList方法,解决办法是将其去掉. package cn.bgo ...

  10. SSM框架—环境搭建(MyEclipse+Tomcat+MAVEN+SVN)

    1.JDK的安装 首先下载JDK,这个从sun公司官网可以下载,根据自己的系统选择64位还是32位,安装过程就是next一路到底.安装完成之后当然要配置环境变量了. 1.1新建变量名:JAVA_HOM ...