35面向对象设计模式之抽象工厂(Abstract Factory)设计模式
Posted sy-liu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了35面向对象设计模式之抽象工厂(Abstract Factory)设计模式相关的知识,希望对你有一定的参考价值。
new的问题:
常规的对一个象创建方法:
// 创建一个Road对象
Road road = new Road();
new的问题:
- 实现依赖,不能应对“具体实例化类型”的变化。
解决思路:
-封装变化点——哪里变化,封装哪里
- 潜台词:如果没有变化, 当然不需要额外的封装
工厂模式的缘起
变化点在“对象创建”,因此就封装“对象创建”
面向接口编程——依赖接口,而非依赖实现
简单工厂的问题:
不能应对“不同系列对象“的变化,比如有不同风格的游戏场景--对应不同风格的道路、房屋、地道。
如何解决:
使用面向对象的技术来封装变化点。
动机:
在软件系统中,经常面临着”一系列相互依赖的对象“的创建工作,同时由于需求的变化,往往存在更多系列对象的创建工作。
如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种”封装机制“来避免客户程序和这种”多系列具体对象创建工作的“的紧耦合?
意图:
提供一个接口,让该接口负责创建一系列”相关或者相互依赖的对象“,无需指定它们具体的类。
结构图
示例代码:
using System; using System.Collections.Generic; using System.Text; namespace 抽象工厂模式 { //道路 public abstract class Road { } //房屋 public abstract class Building { } //地道 public abstract class Tunnel { } //从林 public abstract class Jungle { } //道路 public class ModernRoad:Road { } //房屋 public class ModernBuilding:Building { } //地道 public class ModernTunnel:Tunnel { } //从林 public class ModernJungle:Jungle { } public abstract class FacilitiesFactory { public abstract Road CreateRoad(); public abstract Building CreateBuilding(); public abstract Tunnel CreateTunnel(); public abstract Jungle CreateJungle(); } public class ModernFacilitiesFactory : FacilitiesFactory { public override Building CreateBuilding() { return new ModernBuilding(); } public override Jungle CreateJungle() { return new ModernJungle();; } public override Road CreateRoad() { return new ModernRoad(); } public override Tunnel CreateTunnel() { return new ModernTunnel(); } } //客户程序 class GameManager { FacilitiesFactory facilitiesFactory; Road road; Building building; Tunnel tunnel; Jungle jungle; public GameManager(FacilitiesFactory facilitiesFactory) { this.facilitiesFactory = facilitiesFactory; } public void BuildGameFacilities() { road = facilitiesFactory.CreateRoad(); building = facilitiesFactory.CreateBuilding(); tunnel = facilitiesFactory.CreateTunnel(); jungle = facilitiesFactory.CreateJungle(); } public void Run() { } } class Program { static void Main(string[] args) { GameManager gameManager = new GameManager(new ModernFacilitiesFactory()); gameManager.Run(); } } }
Abstract Factory 模式的几个要点:
如果没有应对”多系列对象构建“的需求变化,则没有必要使用Abstract Factory模式,这时候使用简单的静态工厂完全可以。
”系列对象“指的是这些对象之间相互依赖、或作用的关系,例如游戏开发场景中的”道路“与”房屋“的依赖,”道路”与“地道”的依赖。
Abstract Factory模式主要在于应对”新系列“的需求变动。其缺点在于难以应对”新对象“的需求的变动。
Abstract Factory 经常和Factory Method模式共同组合来应对“对象创建的要求变化。
推荐参考书
《设计模式:可复用面向对象软件的基础》GoF
《面向对象分析与设计》Grady Booch
《敏捷软件开发:原则、模式、与实践》Robert C.Martin
《重构:改善既有代码的设计》Martin Fowler
《Refactoring to Patterns》Joshua Kerievsky
以上是关于35面向对象设计模式之抽象工厂(Abstract Factory)设计模式的主要内容,如果未能解决你的问题,请参考以下文章
设计模式---对象创建模式之抽象工厂模式(Abstract Factory)
go语言设计模式-创建模式之抽象工厂模式(Abstract Factory)
浅析设计模式——创建型模式之Abstract-Factory(抽象工厂模式)