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. 【Head First Java 读书笔记】(五)编写程序

    第五章 编写程序 伪码:伪码能帮你专注于逻辑而不需要顾虑到程序语法 测试码:测试用的程序代码 真实码:实际代码 伪码 伪码是介于真正的java程序与正常英语之间的一种语言.伪码大致包括3部分:实例变量 ...

  2. JavaScript补充:BOM(浏览器对象模型)

    一些公共对象.详细参考手册. 一.Window 对象 Window 对象表示浏览器中打开的窗口. 如果文档包含框架(<frame> 或 <iframe> 标签),浏览器会为 H ...

  3. LSI SAS3IRCU配置SAS3系列RAID卡

    LSI SAS3IRCU配置SAS3系列RAID卡 一.适用的controller LSISAS3008 LSISAS3004 二.名词解释 Controller: IR: Volume: 卷,基于物 ...

  4. C#三层架构搭建

    一.简介 主要分为:界面层(User Interface layer),业务逻辑层(Business Logic Layer),数据访问层(Data access layer) 1.作用 界面层(UI ...

  5. Mongoid Relationships

    1:1 embedded relationship: M:1 linked relationship(one_direction): child uses belongs_to parent uses ...

  6. Spring之BeanFactory与ApplicationConText

    :BeanFactory基本的工厂解析,管理,实例化所有容器内的bean的接口,spring中所有解析配置文件的类都直接或者间接实现该接口ApplicationContext接口implements ...

  7. 洛谷 P2096 最佳旅游线路

    某旅游区的街道成网格状.其中东西向的街道都是旅游街,南北向的街道都是林阴道.由于游客众多,旅游街被规定为单行道,游客在旅游街上只能从西向东走,在林阴道上则既可从南向北走,也可以从北向南走. 阿龙想到这 ...

  8. C#中调用SAPI实现语音识别的2种方法

    通过微软的SAPI,不仅仅可以实现语音合成TTS,同样可以实现语音识别SR.下面我们就介绍并贴出相关代码.主要有两种方式: 1.使用COM组件技术,不管是C++,C#,Delphi都能玩的转,开发出来 ...

  9. (C/C++) 基本排序法

    C++ Class 宣告 class Sort{ private: void Merge(int *arr, int front, int mid, int end); int Partition(i ...

  10. url 路径的拼接

    url  路径的拼接 刚开始做项目总是被路径所困扰,不知道何时该拼接,何时不拼接,怎么拼接,如何拼接,有像地址栏拼接一样的,又在跳转页面拼接的,还有在 a 标签中 href 中拼接的 ,当时做的时候一 ...