http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 3965|回复: 5

[学习心得] C#抽象工厂 (Abstract Factory )

[复制链接]
发表于 2018-12-25 10:03:15 | 显示全部楼层 |阅读模式
一 、  抽象工厂 (Abstract Factory ) 模式

抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。

为了方便引进抽象工厂模式,引进一个新概念:产品族(Product Family)。所谓产品族,是指位于不同产品
等级结构,功能相关联的产品组成的家族。如图:

1.png

图中一共有四个产品族,分布于三个不同的产品等级结构中。只要指明一个产品所处的产品族以及它所属的等级
结构,就可以唯一的确定这个产品。

引进抽象工厂模式
所谓的抽象工厂是指一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象。如果用
图来描述的话,如下图:

2.png

二 、 Abstract Factory  模式的结构

3.png

图中描述的东西用产品族描述如下

4.png

抽象工厂(Abstract Factory)角色:担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关
的。

具体工厂(Concrete Factory)角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合
适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。

抽象产品(Abstract Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥
有的接口。

具体产品(Concrete Product)角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这
是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。

三 、  程序举例 :

该程序演示了抽象工厂的结构,本身不具有任何实际价值。

5.png

[C#] 纯文本查看 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1.AbstractFactory
{
    /// <summary>
    /// 抽象工厂
    /// </summary>
    abstract class AbstractFactory
    {
        // Methods
        public abstract AbstractProductA CreateProductA();
        public abstract AbstractProductB CreateProductB();
    }


    /// <summary>
    /// 具体工厂1
    /// </summary>
    class ConcreteFactory1 : AbstractFactory
    {
        // Methods
        public override AbstractProductA CreateProductA()
        {
            return new ProductA1();
        }

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

    /// <summary>
    /// 具体工厂2
    /// </summary>
    class ConcreteFactory2 : AbstractFactory
    {
        // Methods
        public override AbstractProductA CreateProductA()
        {
            return new ProductA2();
        }
        public override AbstractProductB CreateProductB()
        {
            return new ProductB2();
        }
    }


    /// <summary>
    /// 抽象产品A
    /// </summary>
    abstract class AbstractProductA
    {
    }


    /// <summary>
    /// 抽象产品B
    /// </summary>
    abstract class AbstractProductB
    {
        // Methods
        public abstract void Interact(AbstractProductA a);
    }

    /// <summary>
    /// 产品A1
    /// </summary>
    class ProductA1 : AbstractProductA
    {
    }

    /// <summary>
    /// 产品B1
    /// </summary>
    class ProductB1 : AbstractProductB
    {
        // Methods
        public override void Interact(AbstractProductA a)
        {
            Console.WriteLine(this + " interacts with " + a);
        }
    }

    /// <summary>
    /// 产品A2
    /// </summary>
    class ProductA2 : AbstractProductA
    {
    }

    /// <summary>
    /// 产品B2
    /// </summary>
    class ProductB2 : AbstractProductB
    {
        // Methods
        public override void Interact(AbstractProductA a)
        {
            Console.WriteLine(this + " interacts with " + a);
        }
    }


    // "Client" - the interaction environment of the products
    class Environment
    {
        // Fields
        private readonly AbstractProductA AbstractProductA;
        private readonly AbstractProductB AbstractProductB;

        // Constructors
        public Environment(AbstractFactory factory)
        {
            AbstractProductB = factory.CreateProductB();
            AbstractProductA = factory.CreateProductA();
        }
        // Methods
        public void Run()
        {
            AbstractProductB.Interact(AbstractProductA);
        }
    }
    /// <summary>
    /// ClientApp test environment
    /// </summary>
    class ClientApp
    {
        public void Start()
        {
            AbstractFactory factory1 = new ConcreteFactory1();
            Environment e1 = new Environment(factory1);
            e1.Run();
            AbstractFactory factory2 = new ConcreteFactory2();
            Environment e2 = new Environment(factory2);
            e2.Run();
        }
    }
}






1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2018-12-25 10:16:23 | 显示全部楼层
我只是路过打酱油的。
发表于 2018-12-25 17:18:48 | 显示全部楼层
真是难得给力的帖子啊。
发表于 2018-12-25 17:25:26 | 显示全部楼层
强烈支持楼主ing……
发表于 2018-12-26 15:26:14 | 显示全部楼层
强烈支持楼主ing……
发表于 2018-12-28 08:29:16 | 显示全部楼层
强烈支持楼主ing……
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-5-3 18:15

© 2014-2021

快速回复 返回顶部 返回列表