zoukankan      html  css  js  c++  java
  • C#设计模式——抽象工厂模式(Abstract Factory Pattern)

    一、概述
    在软件开发中,常常会需要创建一系列相互依赖的对象,同时,由于需求的变化,往往存在较多系列对象的创建工作。如果采用常规的创建方法(new),会造成客户程序和对象创建工作的紧耦合。对此,抽象工厂模式提供了一种解耦手段。
    二、抽象工厂模式
    抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
    抽象工厂模式的结构图如下:

    AbstractFactory声明了一个创建抽象产品对象的操作接口。
    ConcreteFactory实现了创建具体产品对象的操作。
    AbstractProduct为一类产品对象声明一个接口。
    ConcreteProduct实现AbstractProduct接口,定义一个将被相应的具体工厂创建的产品对象。
    Client使用AbstractFactory和AbstractProduct声明的接口。
    三、示例
    我们以实现一个汽车工程为例来看一个简单的抽象工厂的例子。
    首先定义抽象工厂

    1     public abstract class CarFactory
    2 {
    3 public abstract void CreateWindows();
    4 public abstract void CreateWheels();
    5 }

    接着实现两个具体的汽车工厂

    复制代码
     1     public class BenzFactory : CarFactory
    2 {
    3 public override void CreateWindows()
    4 {
    5 Console.WriteLine("Create Benz Windows");
    6 }
    7
    8 public override void CreateWheels()
    9 {
    10 Console.WriteLine("Create Benz Wheels");
    11 }
    12 }
    13 public class BMWFactory : CarFactory
    14 {
    15 public override void CreateWindows()
    16 {
    17 Console.WriteLine("Create BMW Windows");
    18 }
    19
    20 public override void CreateWheels()
    21 {
    22 Console.WriteLine("Create BMW Wheels");
    23 }
    24 }
    复制代码

    最后看一下如何调用

    复制代码
     1     static void Main(string[] args)
    2 {
    3 CarFactory carFactory = new BenzFactory();
    4 carFactory.CreateWindows();
    5 carFactory.CreateWheels();
    6
    7 Console.WriteLine("Change Factory To BMWFactory");
    8 carFactory = new BMWFactory();
    9 carFactory.CreateWindows();
    10 carFactory.CreateWheels();
    11
    12 Console.ReadLine();
    13 }
    复制代码

    抽象工厂模式在实际应用中比较广泛,我们可以通过依赖注入的方式传递抽象工厂,并利用反射读取配置文件中关于具体工厂的信息,达到在不修改代码的情况下改变实际产品的目的。

  • 相关阅读:
    SJTU T4143 推箱子
    Markdown基本语法
    命令行的操作——cd
    C++ ------- 类和对象
    数据结构------栈和队列
    MySQL------ 子查询
    MySQL------ SQL99语法
    C++------内存分区模型
    第三章------数据链路层
    MySQL------ SQL92语法
  • 原文地址:https://www.cnblogs.com/amylis_chen/p/6007889.html
Copyright © 2011-2022 走看看