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. linq to sql 实现左(右)连接,那个方法是对的,该怎么处理

    linq to sql 实现左(右)连接,那个方法是对的var query2 = from tb0 in db.table_0  join tb1 in db.table_1 on table_0.关 ...

  2. 个人项目:wc程序(java)

    Github项目地址:https://github.com/jat0824/wc.git 项目相关要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命令行 ...

  3. delphi窗体启动外部exe

    uses Winapi.Windows; WinExec(PAnsiChar(Application.ExeName), sw_normal);   // PAnsiChar : string to ...

  4. 随便写个bat存档

    @echo off @COLOR @echo ------------切换Hosts环境--------------- :Again @set /p choice="切换模式:A:应用环境, ...

  5. spring深入了解心得

    spring 主要核心组件 :Core.上下文(Context) .实体(Bean): spring 主要由两大特色:控制反转(IOC).面向对象(AOP): spring中Core主要用于组建Bea ...

  6. .Net 项目代码风格规范

    最近没啥时间自己状态也不是很好,公司的事情忙,自己也有一些事情要处理,所以好久没有写博客了.利用公司午休时间写一写,以下是参考了一些资料,整理出来,共勉之. 代码风格没有正确与否,重要的是整齐划一,清 ...

  7. LoadRunner---杂问题&接口测试

    问题1] 响应时间是系统完成事务执行准备后所采集的时间戳和系统完成待执行事务后所采集的时间戳之间的时间间隔,是衡量特定类型应用事务性能的重要指标,标志了用户执行一项操作大致需要多长时间.[问题2] 系 ...

  8. loj #2116. 「HNOI2015」开店

    #2116. 「HNOI2015」开店 题目描述 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的想法当然非 ...

  9. 解决 Github用户名 变为 invalid-email-address 问题

    解决 Github用户名 变为 invalid-email-address 问题 If the identity used for this commit is wrong, you can fix ...

  10. postgresql中的各种scan的比较

    最近在看postgresql的查询计划,在查询中对表的扫描计划大概有如下几种: Seq Scan Index Scan Bitmap Heap Scan Index Only Scan 这里就把自己的 ...