目录

定义

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

使用频率:

UML类图

参与者

AbstractFactory:声明一个创建抽象产品的的接口。

ConcreteFactory:实现接口创建具体的产品对象。

AbstractProduct:产品的抽象。

Product:具体的产品,实现抽象产品的接口。

Client:使用抽象工厂和抽象产品。

编写代码

1.新建控制台程序AbstractFactory,新增Abstract.cs类文件

using System;

/// <summary>
/// 抽象工程模式:提供一个创建一系列相关或相互依赖对象的接口,而无须指定具体的类。
/// </summary>
namespace AbstractFactory
{
/// <summary>
/// 抽象产品A
/// </summary>
public abstract class AbstractProductA
{
public abstract void SayHello();
} /// <summary>
/// 抽象产品B
/// </summary>
public abstract class AbstractProductB
{
public abstract void SayHello();
} /// <summary>
/// 具体产品A1
/// </summary>
public class ProductA1 : AbstractProductA
{
public override void SayHello()
{
Console.WriteLine("Hello,我是具体产品A1");
}
} /// <summary>
/// 具体产品A2
/// </summary>
public class ProductA2 : AbstractProductA
{ public override void SayHello()
{
Console.WriteLine("Hello,我是具体产品A2");
}
} /// <summary>
/// 具体产品B1
/// </summary>
public class ProductB1 : AbstractProductB
{
public override void SayHello()
{
Console.WriteLine("Hello,我是具体产品B1");
}
} /// <summary>
/// 具体产品B2
/// </summary>
public class ProductB2 : AbstractProductB
{
public override void SayHello()
{
Console.WriteLine("Hello,我是具体产品B2");
}
} /// <summary>
/// 抽象工厂:提供创建抽象产品的接口
/// </summary>
public abstract class AbstractFactory
{
public abstract AbstractProductA CreateProductA();
public abstract AbstractProductB CreateProductB();
} /// <summary>
/// 具体工厂:实现抽象工厂创建产品的接口
/// </summary>
public class ConcreteFactory1 : AbstractFactory
{
public override AbstractProductA CreateProductA()
{
return new ProductA1();
} public override AbstractProductB CreateProductB()
{
return new ProductB1();
}
} public class ConcreteFactory2 : AbstractFactory
{
public override AbstractProductA CreateProductA()
{
return new ProductA2();
} public override AbstractProductB CreateProductB()
{
return new ProductB2();
}
} public class Client
{
private AbstractProductA _productA;
private AbstractProductB _productB; public Client(AbstractFactory factory)
{
_productA = factory.CreateProductA();
_productB = factory.CreateProductB();
} public void Run()
{
_productA.SayHello();
_productB.SayHello();
}
}
}

2.编写Program.cs

using System;

namespace AbstractFactory
{
class Program
{
static void Main(string[] args)
{
//使用工厂1
AbstractFactory factory = new ConcreteFactory1();
Client client = new Client(factory);//依赖注入
client.Run(); Console.WriteLine(); //使用工厂2
factory = new ConcreteFactory2();
client = new Client(factory);
client.Run(); Console.Read();
}
} }

3.输出结果

特点

1) 分离了具体的类

Abstract Factory 模式帮助你控制一个应用创建的对象的类。因为一个工厂封装创建产品对象的责任和过程,它将客户与类的实现分离。客户通过它们的抽象接口操纵实例。产品的类名也在具体工厂的实现中被分离;它们不出现在客户代码中。

2) 使得易于交换产品系列
一个具体工厂类在一个应用中仅出现一次—即在它初始化的时候。这使得改变一个应用的具体工厂变得很容易。它只需改变具体的工厂即可使用不同的产品配置,这是因为一个抽象工厂创建了一个完整的产品系列,所以整个产品系列会立刻改变。

3) 有利于产品的一致性

当一个系列中的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要。而AbstractFactory很容易实现这一点。

4) 难以支持新种类的产品

难以扩展抽象工厂以生产新种类的产品,这是因为AbstractFactory接口确定了可以被创建的产品集合。 支持新种类的产品就需要扩展该工厂接口,这将涉及 AbstractFactory类及其所有子类的改变。

设计模式成长记(一) 抽象工厂模式(Abstract Factory)的更多相关文章

  1. .NET设计模式(2):1.2 抽象工厂模式(Abstract Factory)

    概述 抽象工厂模式(Abstract Factory)是所有形态的工厂模式中最为抽象和最具一般性的一种形态.抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口 ...

  2. 设计模式之十一:抽象工厂模式(Abstract Factory)

    抽象工厂模式: 提供了一个创建一系列相关的或相互依赖的对象的接口而不须要详细指定它们的类型. Provide an interface for creating families of related ...

  3. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...

  4. 【设计模式】抽象工厂模式 Abstract Factory Pattern

    简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...

  5. 设计模式 - 抽象工厂模式(abstract factory pattern) 具体解释

    抽象工厂模式(abstract factory pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/2709 ...

  6. 二十四种设计模式:抽象工厂模式(Abstract Factory Pattern)

    抽象工厂模式(Abstract Factory Pattern) 介绍提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例有Message和MessageModel,Messag ...

  7. 【UE4 设计模式】抽象工厂模式 Abstract Factory Pattern

    概述 描述 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类:具体的工厂负责实现具体的产品实例 抽象工厂中每个工厂可以创建多种产品(如苹果公司生产iPhone.iPad): 工厂方法 ...

  8. 抽象工厂模式(Abstract Factory)C#实例

    抽象工厂模式(Abstract Factory)C#实例 本文出处http://www.dofactory.com/net/abstract-factory-design-pattern 一.场景描述 ...

  9. 设计模式的征途—3.抽象工厂(Abstract Factory)模式

    上一篇的工厂方法模式引入了工厂等级结构,解决了在原来简单工厂模式中工厂类职责太重的原则,但是由于工厂方法模式的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,从而增加系统开销.那么,我们应该 ...

  10. 设计模式的征途—4.抽象工厂(Abstract Factory)模式

    上一篇的工厂方法模式引入了工厂等级结构,解决了在原来简单工厂模式中工厂类职责太重的原则,但是由于工厂方法模式的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,从而增加系统开销.那么,我们应该 ...

随机推荐

  1. 闲来无事研究一下酷狗缓存文件kgtemp的加密方式

    此贴为本人原创,转载请注明出处 序 前几天更新了被打入冷宫很久的酷狗,等进入之后就感觉菊花一紧----试 听 居 然 都 要 开 通 音 乐 包(高品和无损)才行了,WTF! 这意味着以前缓存的都听不 ...

  2. java 的equals 与== ,null与isempty的区别

    1 . == 是为了判断等号两边 变量 所对应 的 内存中的 值  是否  相等, 只是 值 的比较. 2. 假如    String s1 = new String("abc") ...

  3. Spring3.0官网文档学习笔记(二)

    1.3 使用场景 典型的成熟的spring web应用 spring使用第三方框架作为中间层 远程使用场景 EJB包装 1.3.1 依赖管理.命名规则(包)     spring-*.jar *号代表 ...

  4. Ubuntu 报错 sudo: unable to resolve host

    Ubuntu 在每次执行命令的时候,会报如下错误: $ sudo sudo: unable to resolve host iZ2zecsdy8flu603bmdg1bZ iZ2zecsdy8flu6 ...

  5. Mybatis中如何将POJO作为参数传入sql

    今天在工作时,需要将获取的用户的注册信息插入数据库,开始的做法是将所有的model的属性作为DAO接口的参数,后来想想不对劲,要是有100个属性,那我这个接口岂不是要有100个参数传进来? 于是我就考 ...

  6. .net core系列之初识asp.net core

    .net core已经发布了2.0版本,相对于1.0的有了很大的完善,最近准备在项目中尝试使用asp.net core,所以就进行了一些简单的研究. 初识asp.net core分为以下几个部分: 1 ...

  7. presto

    presto中文站:http://prestodb-china.com/ 进入hadoop机器,进入presto所在bin目录:presto --server localhost:9090 --cat ...

  8. 小程序代码包压缩 策略&方案

    微信小程序自推出以来,逐渐发展,目前正受到越来越多的青睐.其中很重要的一点得益于小程序的轻量级特性,每个小程序最多不超过2MB,招之即来挥之即去,相比于几十上百兆的APP,用户进入小程序,或者说,小程 ...

  9. rwx读写执行对文件和目录的意义

    文件 目录 r 查看 列出目录内容 w 修改 在目录内新建删除文件 x 执行 可以进入目录 对文件的删除权限是对文件所有目录的写权限 对目录-wx的权限,有写和执行权限,既可以在目录内创建删除文件,可 ...

  10. [array] leetcode - 35. Search Insert Position - Easy

    leetcode - 35. Search Insert Position - Easy descrition Given a sorted array and a target value, ret ...