前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式成长记(一) 抽象工厂模式(Abstract Factory)

设计模式成长记(一) 抽象工厂模式(Abstract Factory)

作者头像
刘皓
发布2018-04-03 13:44:24
5970
发布2018-04-03 13:44:24
举报
文章被收录于专栏:.NET后端开发.NET后端开发

目录

  • 定义
  • UML类图
  • 参与者
  • 编写代码
  • 特点

定义

提供一个创建一系列相关或相互依赖的对象的接口,而无需指定具体的类。

使用频率:

UML类图

参与者

AbstractFactory:声明一个创建抽象产品的的接口。

ConcreteFactory:实现接口创建具体的产品对象。

AbstractProduct:产品的抽象。

Product:具体的产品,实现抽象产品的接口。

Client:使用抽象工厂和抽象产品。

编写代码

1.新建控制台程序AbstractFactory,新增Abstract.cs类文件

代码语言:javascript
复制
using System;


/// <summary>
/// 抽象工程模式:提供一个创建一系列相关或相互依赖对象的接口,而无须指定具体的类。
/// </summary>
namespace AbstractFactory
{
    /// <summary>
    /// 抽象产品A
    /// </summary>
    public abstract class AbstractProductA
    {
        public abstract void SayHello();
    }

    /// <summary>
    /// 抽象产品B
    /// </summary>
    public abstract class AbstractProductB
    {
        public abstract void SayHello();
    }

    /// <summary>
    /// 具体产品A1
    /// </summary>
    public class ProductA1 : AbstractProductA
    {
        public override void SayHello()
        {
            Console.WriteLine("Hello,我是具体产品A1");
        }
    }

    /// <summary>
    /// 具体产品A2
    /// </summary>
    public class ProductA2 : AbstractProductA
    {

        public override void SayHello()
        {
            Console.WriteLine("Hello,我是具体产品A2");
        }
    }

    /// <summary>
    /// 具体产品B1
    /// </summary>
    public class ProductB1 : AbstractProductB
    {
        public override void SayHello()
        {
            Console.WriteLine("Hello,我是具体产品B1");
        }
    }

    /// <summary>
    /// 具体产品B2
    /// </summary>
    public class ProductB2 : AbstractProductB
    {
        public override void SayHello()
        {
            Console.WriteLine("Hello,我是具体产品B2");
        }
    }

    /// <summary>
    /// 抽象工厂:提供创建抽象产品的接口
    /// </summary>
    public abstract class AbstractFactory
    {
        public abstract AbstractProductA CreateProductA();
        public abstract AbstractProductB CreateProductB();
    }

    /// <summary>
    /// 具体工厂:实现抽象工厂创建产品的接口
    /// </summary>
    public class ConcreteFactory1 : AbstractFactory
    {
        public override AbstractProductA CreateProductA()
        {
            return new ProductA1();
        }

        public override AbstractProductB CreateProductB()
        {
            return new ProductB1();
        }
    }


    public class ConcreteFactory2 : AbstractFactory
    {
        public override AbstractProductA CreateProductA()
        {
            return new ProductA2();
        }

        public override AbstractProductB CreateProductB()
        {
            return new ProductB2();
        }
    }

    public class Client
    {
        private AbstractProductA _productA;
        private AbstractProductB _productB;

        public Client(AbstractFactory factory)
        {
            _productA = factory.CreateProductA();
            _productB = factory.CreateProductB();
        }

        public void Run()
        {
            _productA.SayHello();
            _productB.SayHello();
        }
    }
}

2.编写Program.cs

代码语言:javascript
复制
using System;

namespace AbstractFactory
{
    class Program
    {
        static void Main(string[] args)
        {
            //使用工厂1
            AbstractFactory factory = new ConcreteFactory1();
            Client client = new Client(factory);//依赖注入
            client.Run();

            Console.WriteLine();

            //使用工厂2
            factory = new ConcreteFactory2();
            client = new Client(factory);
            client.Run();

            Console.Read();
        }
    }

  
}

3.输出结果

特点

1) 分离了具体的类

Abstract Factory 模式帮助你控制一个应用创建的对象的类。因为一个工厂封装创建产品对象的责任和过程,它将客户与类的实现分离。客户通过它们的抽象接口操纵实例。产品的类名也在具体工厂的实现中被分离;它们不出现在客户代码中。

2) 使得易于交换产品系列 一个具体工厂类在一个应用中仅出现一次—即在它初始化的时候。这使得改变一个应用的具体工厂变得很容易。它只需改变具体的工厂即可使用不同的产品配置,这是因为一个抽象工厂创建了一个完整的产品系列,所以整个产品系列会立刻改变。

3) 有利于产品的一致性

当一个系列中的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要。而AbstractFactory很容易实现这一点。

4) 难以支持新种类的产品

难以扩展抽象工厂以生产新种类的产品,这是因为AbstractFactory接口确定了可以被创建的产品集合。 支持新种类的产品就需要扩展该工厂接口,这将涉及 AbstractFactory类及其所有子类的改变。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-01-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
  • 定义
  • UML类图
  • 参与者
  • 编写代码
  • 特点
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档