抽象工厂方法模式(Abstract Factory Pattern)

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)。

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

抽象类:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5
 6 namespace DesignPattern.AbscractFactoryPattern
 7 {
 8     //这里使用抽象类是因为接口必须在子类实现方法,抽象类可以延迟到抽象子类去。
 9     public abstract class AbstractCar
10     {
11         public abstract void Run();
12         public abstract void BeBe();
13         public abstract void GetBrand();
14     }
15
16     public abstract class AbstractCarFactory
17     {
18         public static AbstractCarFactory GetInsance()
19         {
20             //这里应该去读取配置文件,由于是demo就直接赋值了。
21             string factoryName = "BMWCarFactory";
22
23             AbstractCarFactory instance;
24
25             if (factoryName != "")
26                 instance = (AbstractCarFactory)Assembly.Load("DesignPattern").CreateInstance("DesignPattern.AbscractFactoryPattern." + factoryName);
27             else
28                 instance = null;
29
30             return instance;
31         }
32         public abstract AbstractCar CreateSaloonCar();
33         public abstract AbstractCar CreateTruckCar();
34     }
35
36     public abstract class AbstractSaloonCar : AbstractCar
37     {
38         public override void Run()
39         {
40             Console.WriteLine("我是轿车~~");
41         }
42
43         public override void BeBe()
44         {
45             Console.WriteLine("嘀嘀嘀~!!!");
46         }
47     }
48
49     public abstract class AbstractTruckCar : AbstractCar
50     {
51         public override void Run()
52         {
53             Console.WriteLine("我是大卡卡卡卡……");
54         }
55
56         public override void BeBe()
57         {
58             Console.WriteLine("嘟嘟嘟嘟嘟!!!");
59         }
60     }
61 }

Benz工厂

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5
 6 namespace DesignPattern.AbscractFactoryPattern
 7 {
 8     public class BenzCarFactory : AbstractCarFactory
 9     {
10         public override AbstractCar CreateSaloonCar()
11         {
12             return new BenzSaloonCar();
13         }
14
15         public override AbstractCar CreateTruckCar()
16         {
17             return new BenzTruckCar();
18         }
19     }
20
21     public class BenzSaloonCar : AbstractSaloonCar
22     {
23         public override void GetBrand()
24         {
25             Console.WriteLine("我是奔驰轿车!!!");
26         }
27     }
28
29     public class BenzTruckCar : AbstractTruckCar
30     {
31         public override void GetBrand()
32         {
33             Console.WriteLine("我是奔驰大卡!!!");
34         }
35     }
36 }

BMW工厂

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5
 6 namespace DesignPattern.AbscractFactoryPattern
 7 {
 8     public class BMWCarFactory : AbstractCarFactory
 9     {
10         public override AbstractCar CreateSaloonCar()
11         {
12             return new BMWSaloonCar();
13         }
14
15         public override AbstractCar CreateTruckCar()
16         {
17             return new BMWTruckCar();
18         }
19     }
20
21     public class BMWSaloonCar : AbstractSaloonCar
22     {
23         public override void GetBrand()
24         {
25             Console.WriteLine("我是宝马轿车!");
26         }
27     }
28
29     public class BMWTruckCar : AbstractTruckCar
30     {
31         public override void GetBrand()
32         {
33             Console.WriteLine("我是宝马大卡!!!");
34         }
35     }
36 }

模拟场景

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

1 //与工厂模式最大区别就是一个产品族的问题,同样的产品拥有很多相同约束,这样就不用重复写代码。
2 //AbstractCarFactory BenzFactory = new BenzCarFactory();//这里使用反射完全解耦
3 AbstractCarFactory Factory = AbstractCarFactory.GetInsance();
4 AbstractCar _saloonCar = Factory.CreateSaloonCar();
5 _saloonCar.BeBe();
6 _saloonCar.Run();
7 _saloonCar.GetBrand();
时间: 2024-10-28 09:50:53

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

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

抽象工厂模式(Abstract Factory Pattern) 介绍提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例有Message和MessageModel,Message有一个Insert()方法,该方法的参数是MessageModel. AbstractMessageModel using System; using System.Collections.Generic; using System.Text; namespace Pattern.Abstract

设计模式 - 抽象工厂模式(abstract factory pattern) 详解

抽象工厂模式(abstract factory pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27091671 参考工厂模式: http://blog.csdn.net/caroline_wendy/article/details/27081511 抽象工厂模式: 提供一个接口, 用于创建相关或依赖对象的家族, 而不需要明确指定具体类. 全部代码: http://download.csdn.net/de

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

抽象工厂模式(abstract factory pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27091671 參考工厂模式: http://blog.csdn.net/caroline_wendy/article/details/27081511 抽象工厂模式: 提供一个接口, 用于创建相关或依赖对象的家族, 而不须要明白指定详细类. 所有代码: http://download.csdn.net/

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

简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式相对于简单工厂和工厂方法模式来着更具抽象性. 一.抽象工厂模式演绎 我们先来看一个简单的需求: 甲方要开发一套办公自动化软件,其中有一个非常重要的功能就是要能够导入Word 文档和Excel 文档. 开发人员拿到需求后就开始编码了,  很快代码写完了: public class ImportTool

设计模式:工厂方法模式(Factory Method)和抽象工厂模式(Abstact Factory)

?在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 分类 ?工厂模式主要是为创建对象提供过渡接口,以便将创建对象的

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

工厂方法模式(Factory Method) ——.NET设计模式系列之五 Terrylee,2004年1月2日 概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口.如何应对这种变化?提供一种封装机制来隔离出“这个易变对象”的变化,从而保持系统中“其它依赖该对象的对象”不随着需求的改变而改变?这就是要说的Factory Method模式了. 意图 定义一个用户创建对象的接口,让子类决定实例化哪一个类.Facto

Java设计模式-工厂方法模式(Factory Method)

工厂方法模式(Factory Method) 工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建.在以下的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式. 1:普通工厂模式 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建 例,按下图写一个普通工厂方法模式 首先,创建共同接口sender public interface Sender

设计模式总结篇系列:工厂方法模式(Factory Method)

工厂方法模式适合于对实现了同一接口或继承了同一父类的一些类进行实例的创建.一般是通过定义一个工厂类,并在其方法中实现对具有上述特点的类对象的创建. 根据具体产生类对象的方法定义形式,又可以将其分为普通工厂方法模式.多个工厂方法模式和静态工厂方法模式. 一.普通工厂方法模式: 常见的经典写法如下(以发送邮件和短信为例): 1.定义邮件类和短信类具有的共同接口: 1 interface Sender{ 2 3 public void sender(); 4 5 } 2.定义邮件类和短信类: 1 cl

设计模式-04抽象工厂模式(Abstract Factory Pattern)

1.模式动机 在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法.但是有时候我们需要一个工厂可以提供多个产品对象,而不是单一的产品对象. 为了更清晰地理解工厂方法模式,需要先引入两个概念: 产品等级结构:产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机.海信电视机.TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌

1 工厂方法模式(Factory Method)和 2 抽象工厂模式(Abstract Factory)

简单工厂: public class SendFactory { public Sender produce(String type) { if ("mail".equals(type)) { return new MailSender(); } else if ("sms".equals(type)) { return new SmsSender(); } else { System.out.println("请输入正确的类型!"); retu