GOF之抽象工厂模式

动机(Motivation)

在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时,由于需求的变化,往往存在更多系列的对象的创建工作。

如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?

意图(Intene)

提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定他们具体的类。

结构(Stucture)

具体代码实现:

1 对应图中的AbstractFactory
2 abstract class FacilitiesFactory
3     {
4         public abstract Road CreateRoad();
5         public abstract Building CreateBuilding();
6     }
 1 对应图中的AbstractProductA
 2 abstract class Road
 3     {
 4         private string _name;
 5         public string Name
 6         {
 7             get { return _name; }
 8             set { _name = value; }
 9         }
10         public abstract void RoadMethod();
11     }
 1 对应图中的AbstractProductB
 2 abstract class Building
 3     {
 4         private string _name;
 5         public string Name
 6         {
 7             get { return _name; }
 8             set { _name = value; }
 9         }
10         public abstract void BuildingMethod();
11     }
 1 对应图中的ConcreteFactory1
 2  class ModenFacilities:FacilitiesFactory
 3     {
 4         public override Road CreateRoad()
 5         {
 6             return new ModenRoad("现代风格的");
 7         }
 8
 9         public override Building CreateBuilding()
10         {
11             return new ModenBuilding("现代风格的");
12         }
13     }
 1 对应图中的ConcreteFactory2
 2 class ClassicFacilities:FacilitiesFactory
 3     {
 4         public override Road CreateRoad()
 5         {
 6             return new ClassicRoad("古典风格的");
 7         }
 8
 9         public override Building CreateBuilding()
10         {
11             return new ClassicBuilding("古典风格的");
12         }
13     }
 1 对应图中的Client
 2 class GameManage
 3     {
 4         private FacilitiesFactory facilitiesFactory;
 5         private Road road;
 6         private Building building;
 7         public GameManage(FacilitiesFactory facilitiesFactory)
 8         {
 9             this.facilitiesFactory = facilitiesFactory;
10         }
11         public void BuildFacilities()
12         {
13             road = facilitiesFactory.CreateRoad();
14             building = facilitiesFactory.CreateBuilding();
15         }
16         public void Run()
17         {
18             road.RoadMethod();
19             building.BuildingMethod();
20         }
21     }
 1 对应图中的ProductA1
 2 class ModenRoad:Road
 3     {
 4         public override void RoadMethod()
 5         {
 6             Console.WriteLine("{0}的道路",this.Name);
 7         }
 8         public ModenRoad(string name)
 9         {
10             this.Name = name;
11         }
12     }
 1 对应图中ProductB1
 2 class ModenBuilding:Building
 3     {
 4
 5         public override void BuildingMethod()
 6         {
 7             Console.WriteLine("{0}的建筑物",this.Name);
 8         }
 9         public ModenBuilding(string name)
10         {
11             this.Name = name;
12         }
13     }
 1 对应图中ProductA2
 2 class ClassicRoad:Road
 3     {
 4         public override void RoadMethod()
 5         {
 6             Console.WriteLine("{0}的道路", this.Name);
 7         }
 8         public ClassicRoad(string name)
 9         {
10             this.Name = name;
11         }
12     }
 1 对应图中ProductB2
 2  class ClassicBuilding:Building
 3     {
 4         public override void BuildingMethod()
 5         {
 6             Console.WriteLine("{0}的建筑物", this.Name);
 7         }
 8         public ClassicBuilding(string name)
 9         {
10             this.Name = name;
11         }
12     }
1 这是主函数的调用
2  static void Main(string[] args)
3  {
4       GameManage g = new GameManage(new ClassicFacilities());
5       g.BuildFacilities();
6       g.Run();
7       Console.ReadKey();
8  }

Abstract Factory模式的几个要点

如果没有应对“多系列对象构建”的需求变化,则没有必要使用Abstract Factory模式,这时候使用简单的静态工厂。

“系列对象”指的是这些对象之间有相互依赖、或作用的关系,例如游戏开发场景中的“道路”与“房屋”的依赖。

Abstract Factory模式主要在于应对“新系列”的需求变动,其缺点在于难以应对“新对象”的需求变动。

Abstract Factory模式经常和Factory Method模式共同组合来应对“对象创建”的需求变化。

时间: 2024-08-28 08:19:37

GOF之抽象工厂模式的相关文章

GoF——抽象工厂模式

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.

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

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

[设计模式篇]工厂模式和抽象工厂模式

最近在看Head First的Design Pattern,想想去年候捷来学校给我们讲Design Pattern,但当时水平太弱根本听不懂,今年想趁机再好好学一波,候捷反而不来了,哎,人生就是这样,有些机会真的搞不好只有一次了,所以还是要多多珍惜,不然... ... (再水下去估计没人看了,废话少说,这篇就当一个开篇之作吧,虽然已经看了不少了.) Head First这本书用了一个披萨店的例子,从简单工厂(严格来说这不算一种Gof的设计模式,更像是一种编程习惯),到介绍工厂模式,再介绍到抽象工

简单工厂模式、工厂方法模式和抽象工厂模式-设计模式学习

1.简单工厂模式 简单工厂模式是属于创建型模式,又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现. 工厂(Creator)角色 简单工厂模式的核心,它负责实现创建所有实例的内部逻辑.工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象. 抽象产品(Product)角色 简单工厂模式所创建的所有

工厂方法模式与抽象工厂模式

本文转自:http://laughingchs.iteye.com/blog/1169986 一.引子       话说十年前,有一个暴发户,他家有三辆汽车——Benz奔驰.Bmw宝马.Audi奥迪,还雇了司机为他开车.不过,暴发户坐车时总是怪怪的:上Benz车后跟司机说“开奔驰车!”,坐上Bmw后他说“开宝马车!”,坐上Audi说“开奥迪车!”.你一定说:这人有病!直接说开车不就行了?!       而当把这个暴发户的行为放到我们程序设计中来时,会发现这是一个普遍存在的现象.幸运的是,这种有病

【Unity与23种设计模式】抽象工厂模式(Abstract Factory)

GoF中定义: "提供一个能够建立整个类群组或有关联的对象,而不必指明它们的具体类." 意思就是 根据不同的执行环境产生不同的抽象类子类 抽象工厂模式经常在面试中会涉及到 下面的例子为工厂1和工厂2 两个工厂都可以生成产品A和B 但是两个工厂工艺不同 所以工厂1只能生产产品A1和B1 工厂2只能生产产品A2和B2 //可生成各抽象成品对象的操作 public abstract class AbstractFactory{ public abstract AbstractProductA

设计模式(一): abstract factory抽象工厂模式 -- 创建型模式

1.定义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 2.适用场景 1.一个系统要独立于它的产品创建.组合和表示. 2.一个系统要由多个产品系列中的一个来配置. 3.当你要强调一系列相关的产品对象的设计以便进行联合使用. 4.当你提供一个产品类库,而只想显示它们的接口而不是实现. 3.评价 1.它分离了具体的类 2.它使得易于交换产品系列 3.它有利于产品的一致性 4.难以支持新种类的产品 5."开放-封闭"原则要求系统对扩展开放,对修改封闭.通过扩展达到增

笔记十三:设计模式之简单工厂模式、工厂方法模式、抽象工厂模式

引言: 假设现在有一个超市(Market),超市销售饼干(Biscuit).水果(Fruit).饮料(Drink)三种食品. 按照常规,我们建立三个类:class Biscuit.class Fruit.class Drink. class Biscuit{ public: Biscuit(){} ~Biscuit(){} void Show(){ cout << "Hi,customers! I'm Biscuit!" << endl; } }; class

.NET设计模式(3):抽象工厂模式(Abstract Factory)(转)

概述 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作.如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?这就是我们要说的抽象工厂模式. 意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 模型图 逻辑模型: 物理模型: 生活中的例子 抽象工厂的目的是要提供一个创建一系列相关或相互依赖对象的接口,而不需要指定它们具体的类.这种