一、产生背景

抽象工厂模式(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. DataTable与List<T>相互转换

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  2. Spring使用ajax异步上传文件

    单文件上传 <!-- 创建文件选择框 --> 文件上传 :<input type="file" id="file" name="fi ...

  3. js对HTML字符转义与反转义

    注意: 在编写html时,经常需要转义,才能正常显示在页面上. 并且,还可以防止xss. 解决方案: 一, 使用正则: 使用正则转码: var value = document.getElementB ...

  4. Spring之AOP的注解配置

    配置过程可以简单的分为3步: 1,业务类配置 在业务类前加入,将业务类交由Spring管理 @Component("s") 这个表示,这个业务类的Bean名字为 s . 2,将切点 ...

  5. js 移动端上拉刷新(基于ng1)

    //分页下拉 var ajaxScroll = function() { var screenHeight = window.screen.height; $(document).scroll(fun ...

  6. @RequestBody Spring MVC 示例

    1.前端的访问请求 <script type="text/javascript"> $(document).ready(function(){ var saveData ...

  7. 微信小程序调用地图选取位置后返回信息

    先看一下wxml的代码,绑定个事件! <view class='carpool_data_all'> <view class='aa'> <text>*出发地< ...

  8. [总结]JS操作DOM常用API详解

    文本整理了javascript操作DOM的一些常用的api,根据其作用整理成为创建,修改,查询等多种类型的api,主要用于复习基础知识,加深对原生js的认识. 基本概念 在讲解操作DOM的api之前, ...

  9. 2018-05-09 5分钟入门CTS-尝鲜中文版TypeScript

    知乎原链 本文为中文代码示例之5分钟入门TypeScript的CTS版本. CTS作者是@htwx(github). 它实现了关键词和标准库的所有命名汉化. 本文并未使用附带的vscode相关插件(包 ...

  10. Ubuntu-Tweak 安装

    Ubuntu Tweak 是中国人开发的一款专门为Ubuntu准备的配置.调整工具,类似与compiz,界面更友好.   下面是安装命令:   第一步:添加tweak源 sudo add-apt-re ...