C# 设计模式4 抽象工厂(AbstractFactory)

参考:head first 设计模式

应用场景

解决工厂方法模式中存在的不足。
工厂方法中只能创建一类产品,不能创建多种类别的产品。
比如海尔,TCL都可以做空调,手机,冰箱,电视等。
当系统中有多种产品,每个工厂来负责创建同一族别但属于不同类结构的产品。
一次很可能只创建一种产品。
再比如:绝味鸭脖想在湖南或河南开工厂,可以做鸭脖,鸭掌,鸭翅等。但两地的口味不一样,
有的喜欢吃辣的,有的喜欢吃麻的,其它地方也可能是其它的口味,那么它将根据当地的习惯来
创建不同味道的产品。

结构

抽象工厂:AbstractFactory 定义创建产品的功能(可以接口或抽象类),它为访问类提供了一个创建一组相关或相互依赖对象的接口,它是工厂方法模式的升级。
具体工厂:ConcreteFactory 定义创建何种产品以及具体创建
抽象产品:Product 定义产品的特征和功能(可为接口或抽象类)
具体产品:ConreteProduct 空调 电视 实现抽象产品功能特征的实现

图例

在这里插入图片描述

特点

加入了抽象工厂来创建一组产品,无需关心具体创建的产品是什么
优点:可以在工厂类的内部对产品族中的同级别的产品进行管理,不必引入多个新类来进行管理;当增加一个新产品的时候不需要改动源代码。
缺点:当产品族中加入新的产品时,所有的工厂类都要进行修改。比如海尔、tcl都要生产车,就需要进行修改工厂类

系统自带

System.Data.Common.DbProviderFactory
看 代码2

代码1
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DesignPattern
{ 
    public class AbstractFactory1
    {
        public static void main()
        {
            //TCL工厂生产的手机和电视
            TCLFactory nfact = new TCLFactory();
            nfact.CreatePhone().ToString();
            nfact.CreateTV().ToString();
            nfact.CreatePhone().Produce();
            nfact.CreateTV().Produce();

            //格力工厂生产的手机和电视
            GeLiFactory sfact = new GeLiFactory();
            sfact.CreatePhone().ToString();
            sfact.CreateTV().ToString();
            sfact.CreatePhone().Produce();
            sfact.CreateTV().Produce();
        }
    }

    /// <summary>
    /// 抽象工厂类,提供创建两个不同厂家的手机和电视 
    /// </summary>
    public abstract class AbstractFactory
    {
        public abstract Phone CreatePhone();
        public abstract Tv CreateTV();
    }

    /// <summary>
    /// TCL生产手机和电视
    /// </summary>
    public class TCLFactory : AbstractFactory
    {
        public override Phone CreatePhone()
        {
            return new TclPhone();
        }

        public override Tv CreateTV()
        {
            return new TclTV();
        }
    }

    /// <summary>
    /// 格力生产手机和电视
    /// </summary>
    public class GeLiFactory : AbstractFactory
    {
        public override Phone CreatePhone()
        {
            return new GeLiPhone();
        }

        public override Tv CreateTV()
        {
            return new GeLiTV();
        }
    }

    /// <summary>
    /// 抽象类,供每个厂家继承
    /// </summary>
    public abstract class Phone
    {
        public abstract void Produce();
    }

    /// <summary>
    /// 抽象类,供每个厂家继承
    /// </summary>
    public abstract class Tv
    {
        public abstract void Produce();
    }

    /// <summary>
    /// TCL手机
    /// </summary>
    public class TclPhone : Phone
    {
        public override void Produce()
        {
            Console.WriteLine(nameof(TclPhone));
        }
    }

    /// <summary>
    /// TCL电视 
    /// </summary>
    public class TclTV : Tv
    {
        public override void Produce()
        {
            Console.WriteLine(nameof(TclTV));
        }
    }

    /// <summary>
    /// 格力手机
    /// </summary>
    public class GeLiPhone : Phone
    {
        public override void Produce()
        {
            Console.WriteLine(nameof(GeLiPhone));
        }
    }

    /// <summary>
    /// 格力电视 
    /// </summary>
    public class GeLiTV : Tv
    {
        public override void Produce()
        {
            Console.WriteLine(nameof(GeLiTV));
        }
    }

    //如何应对变更?比如志高厂家 想生产手机和电视
    //只需添加3个类 ZhiGaoFactory ZhiGaoPhone ZhiGaoTv
    //ZhiGaoFactory,其它两个类负责具体产品的创建 这里不再具体实现
}
代码2
    //.net中抽象工厂模式的实现System.Data.Common.DbProviderFactory 
    //DbProviderFactory是一个抽象工厂,它提供了创建数据库连接时所需要的对象集合的接口
    //实际创建的工作在其子类工厂中进行,微软提供了SqlServer的具体工厂类实现
	public abstract class DbProviderFactory
    {
        protected DbProviderFactory();
        public virtual bool CanCreateDataSourceEnumerator{get;}
        public virtual DbCommand CreateCommand();
        //建造者模式的应用,大家可以自己扒拉下源码
        public virtual DbCommadBuilder CreateCommandBuilder();
        public virutal DbConnection CreateConnection();
        //建造者模式的应用
        public virtual DbConnectionStringBuilder CreateConnectionStringBuilder();
        //适配器模式的应用
        public virtual DbDataAdapter CreateDataAdapter();
        //迭代器模式的应用
        public virtual DbDataSourceEnumerator CreateDataSourceEnumerator();
        public virtual DbParameter CreateParameter();
        public virtual CodeAccessionPermission CreatePermission(PermissionState state);
    }

    //现在微软开源了可以看下代码 
    //其中用到几个模式,大家可以自己扒拉下源码
    using System;
    using System.Data;
    using System.Data.Common;
    using System.Data.Sql;
    using System.Security;
    using System.Security.Permissions;
    namespace System.Data.SqlClient{
        public sealed class SqlClientFactory:DbProviderFactory,IServiceProvider{
            public static readonly SqlClientFactory Instance = new SqlClientFactory();
            
            private SqlClientFactory(){
            }
            
            public override bool CanCreateDataSourceEnumerator{
                get{
                    return true;
                }
            }
            public override DbCommand CreateCommand(){
                return new SqlCommand();
            } 
            
            public override DbCommandBuilder CreateCommandBuilder(){
                return new SqlCommandBuilder();
            }
            
            public override DbConnection CreateConnection(){
                return new SqlConnection();
            }

            public override DbConnectionStringBuilder CreateConnectionStringBuilder(){
                return new SqlConnectionStringBuilder();
            }

            public override DbDataAdapter CreateDataAdapter(){
                return new SqlDataAdapter();
            }

            public override DbParameter CreateParameter(){
                return new SqlParameter();
            }
            
            public override CodeAccessPermission CreatePermission(PermissionState state) {
            return new SqlClientPermission(state);
            }

            public override DbDataSourceEnumerator CreateDataSourceEnumerator() {
                return SqlDataSourceEnumerator.Instance;
            }

            /// <summary>
            /// Extension mechanism for additional services; currently the only service
            /// supported is the DbProviderServices
            /// </summary>
            /// <returns>requested service provider or null.</returns>
            object IServiceProvider.GetService(Type serviceType){
                object result = null;
                if(serviceType==GeeenMethods.SystemDataCommonDbProviderServvices_Type){
                    result = GreenMethods.SystemDataSqlClientSqlProviderServices_Instance();
                }
                return result;
            }
    } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值