为了账号安全,请及时绑定邮箱和手机立即绑定

抽象工厂模式(Abstract Factory)

标签:
C#

定义

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

使用频率:https://img1.sycdn.imooc.com//5af3f9f300011f4101710034.jpg

 

UML类图

https://img1.sycdn.imooc.com//5af3f9fe00015b8004880486.jpg

 

参与者

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

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

AbstractProduct:产品的抽象。

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

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

 

编写代码

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

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

复制代码

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.输出结果

 https://img1.sycdn.imooc.com//5af3fa92000105cf06220125.jpg

 

特点

1) 分离了具体的类

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


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


3) 有利于产品的一致性

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

 

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

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

 

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消