Provide an interface for creating families of related or dependent objects without specifying their concrete classes.
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

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

何时使用:系统的产品多于一个的产品族,而系统只消费其中某一族的产品。

如何解决:在一个产品族里面,定义多个产品。

关键代码:在一个工厂里聚合多个同类产品。

应用实例:汽车工厂生产轿车和卡车,轿车和卡车就是同类产品(都是汽车嘛,汽车内当然大多零件生产是相通的),通过抽象工厂,还可以复用许多代码。

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

缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。如示例中,增加一个MiniCar产品,改动较大,但是如果说增加一个五菱品牌(相当于产品等级,肯定比BMW级别低了很多吧),直接继承抽象类扩展即可。

使用场景: 1、QQ 换皮肤,一整套一起换。 2、生成不同操作系统的程序(因为接口相同,调用工厂的不同方法生产相应操作系统的程序,屏蔽底层操作影响,例如AppFactory.CreateLinuxApp,AppFactory.CreateWindowsApp)。

注意事项:产品族难扩展,产品等级易扩展。

抽象类:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPattern.AbscractFactoryPattern
{
//这里使用抽象类是因为接口必须在子类实现方法,抽象类可以延迟到抽象子类去。
public abstract class AbstractCar
{
public abstract void Run();
public abstract void BeBe();
public abstract void GetBrand();
} public abstract class AbstractCarFactory
{
public static AbstractCarFactory GetInsance()
{
//这里应该去读取配置文件,由于是demo就直接赋值了。
string factoryName = "BMWCarFactory"; AbstractCarFactory instance; if (factoryName != "")
instance = (AbstractCarFactory)Assembly.Load("DesignPattern").CreateInstance("DesignPattern.AbscractFactoryPattern." + factoryName);
else
instance = null; return instance;
}
public abstract AbstractCar CreateSaloonCar();
public abstract AbstractCar CreateTruckCar();
} public abstract class AbstractSaloonCar : AbstractCar
{
public override void Run()
{
Console.WriteLine("我是轿车~~");
} public override void BeBe()
{
Console.WriteLine("嘀嘀嘀~!!!");
}
} public abstract class AbstractTruckCar : AbstractCar
{
public override void Run()
{
Console.WriteLine("我是大卡卡卡卡……");
} public override void BeBe()
{
Console.WriteLine("嘟嘟嘟嘟嘟!!!");
}
}
}

Benz工厂

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPattern.AbscractFactoryPattern
{
public class BenzCarFactory : AbstractCarFactory
{
public override AbstractCar CreateSaloonCar()
{
return new BenzSaloonCar();
} public override AbstractCar CreateTruckCar()
{
return new BenzTruckCar();
}
} public class BenzSaloonCar : AbstractSaloonCar
{
public override void GetBrand()
{
Console.WriteLine("我是奔驰轿车!!!");
}
} public class BenzTruckCar : AbstractTruckCar
{
public override void GetBrand()
{
Console.WriteLine("我是奔驰大卡!!!");
}
}
}

BMW工厂

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPattern.AbscractFactoryPattern
{
public class BMWCarFactory : AbstractCarFactory
{
public override AbstractCar CreateSaloonCar()
{
return new BMWSaloonCar();
} public override AbstractCar CreateTruckCar()
{
return new BMWTruckCar();
}
} public class BMWSaloonCar : AbstractSaloonCar
{
public override void GetBrand()
{
Console.WriteLine("我是宝马轿车!");
}
} public class BMWTruckCar : AbstractTruckCar
{
public override void GetBrand()
{
Console.WriteLine("我是宝马大卡!!!");
}
}
}

模拟场景

这个月只生产Benz轿车。下个月生产卡车换个方法即可。下一年生产BMW换个工厂即可(修改配置文件)。

 //与工厂模式最大区别就是一个产品族的问题,同样的产品拥有很多相同约束,这样就不用重复写代码。
//AbstractCarFactory BenzFactory = new BenzCarFactory();//这里使用反射完全解耦
AbstractCarFactory Factory = AbstractCarFactory.GetInsance();
AbstractCar _saloonCar = Factory.CreateSaloonCar();
_saloonCar.BeBe();
_saloonCar.Run();
_saloonCar.GetBrand();

抽象工厂方法模式(Abstract Factory Pattern)的更多相关文章

  1. 设计模式(三)工厂方法模式(Factory Pattern)

    一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以 ...

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

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

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

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

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

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

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

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

  6. 工厂方法模式(Factory Method)和抽象工厂模式(Abstact Factory)

    分类 工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的.工厂模式在<Java 与模式>中分为三类:1)简单工厂模式(Simple Facto ...

  7. .NET设计模式(5):工厂方法模式(Factory Method)

    ):工厂方法模式(Factory Method)    工厂方法模式(Factory Method) --.NET设计模式系列之五 Terrylee,2004年1月2日 转载:http://terry ...

  8. 设计模式 - Abstract Factory模式(abstract factory pattern) 详细说明

    Abstract Factory模式(abstract factory pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/ ...

  9. NET设计模式 第二部分 创建型模式(4):工厂方法模式(Factory Method)

    工厂方法模式(Factory Method) ——.NET设计模式系列之五 Terrylee,2004年1月2日 概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实 ...

  10. .NET设计模式(5):工厂方法模式(Factory Method)(转)

    工厂方法模式(Factory Method) ——.NET设计模式系列之五 Terrylee,2004年1月2日 概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实 ...

随机推荐

  1. C#中特殊的string类型

                                                                                  string C#有string关键字,在翻 ...

  2. 在MYSQL中运用全文索引(FULLTEXT index)

    在MYSQL中使用全文索引(FULLTEXT index) MYSQL的一个很有用的特性是使用全文索引(FULLTEXT index)查找文本的能力.目前只有使用MyISAM类型表的时候有效(MyIS ...

  3. 挂载ISO 和 KILL 掉占用进程

    mount -t iso9660 -o loop,user VMware-tools-linux-8.6.0-425873.iso /mnt/cdrom fuser -m -v -i -k  /mnt ...

  4. HTML5+CSS3从入门到精通 中文pdf版​

    HTML5+CSS3从入门到精通是通过基础知识+中小实例+综合案例的方式,讲述了用HTML5+ CSS3设计构建网站的必备知识,相对于专业指南.高级程序设计.开发指南同类图书,本书是一本适合快速入手的 ...

  5. C# Socket通信改进记录

    1. Socket 使用原始Socket,Send和Recv方法 进行发送和消息获取.(另起后台线程 不停获取和发送) public void RecvMsg() { //receive messag ...

  6. Transaction And Lock--快照事务隔离级别

    --================================================--准备数据GOCREATE DATABASE DB5GOUSE DB5GOCREATE TABLE ...

  7. .NET Framework的一些基本概念

    各种Framework的区别(按在Windows程序管理中显示的名称) .NET Framework: 运行环境,仅用于运行程序 .NET Framework Developer Pack: 包含Ru ...

  8. 十二、Nodejs 包与 NPM 第三方模块安装 package.json 以及 CNPM

    1. 包 Nodejs 中除了它自己提供的核心模块外,我们可以自定义模块,也可以使用第三方的模块.Nodejs 中第三方模块由包组成,可以通过包来对一组具有相互依赖关系的模块进行统一管理. 在 Nod ...

  9. AppIcon应用图标 and Launchimage启动图标的制作

    1.制作软件 需要在AppStore里搜索:Appicons and Launchimages Lite 2.操作步骤 看图示意(三步) 1)选择资源源文件 2)选择需要应用的平台 3)选择生成的目标 ...

  10. 定时器timer类

    timer类 Timer(定时器)是Thread的派生类,用于在指定时间后调用一个方法. 构造方法: Timer(interval, function, args=[], kwargs={})  in ...