C#简单工厂的实现

最近在看一些与设计模式相关的书,现在来说一说C#中简单工厂模式的实现。不过需要注意的是,简单工厂模式严格来说并不算是设计模式(PS:违反开闭原则),因此它只是一种编程的习惯。在这里我通过一个例子进行说明。
大家都知道数据库能够读取数据和写入数据,那么这里就产生了两个抽象概念,第一个就是数据库的概念,到底是SqlServerf还是Oracle还是Access?第二个就是读取和写入的概念,因为每种数据库读取和写入的方法都不一样。因此,在这里我们可以考虑建立一个抽象类Db,它包含两个抽象方法,即:ReadData和WriteData。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1.SimpleFactory
{
    public abstract class Db
    {
        /// 
        /// 读取数据
        /// 
        public abstract void ReadData();

        /// 
        /// 写入数据
        /// 
        public abstract void WriteData();
    }
}

创建好抽象类之后,紧接着就是创建具体的产品类了,产品类继承抽象类,对其中的方法进行实现。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1.SimpleFactory
{
    public class DbSqlServer : Db
    {
        /// 
        /// 读取数据
        /// 
        public override void ReadData()
        {
            Console.WriteLine("SqlServer读取数据");
        }

        /// 
        /// 写入数据
        /// 
        public override void WriteData()
        {
            Console.WriteLine("SqlServer写入数据");
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1.SimpleFactory
{
    public class DbOracle : Db
    {
        /// 
        /// 读取数据
        /// 
        public override void ReadData()
        {
            Console.WriteLine("Oracle读取数据");
        }

        /// 
        /// 写入数据
        /// 
        public override void WriteData()
        {
            Console.WriteLine("Oracle写入数据");
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1.SimpleFactory
{
    public class DbAccess : Db
    {
        /// 
        /// 读取数据
        /// 
        public override void ReadData()
        {
            Console.WriteLine("Access读取数据");
        }

        /// 
        /// 写入数据
        /// 
        public override void WriteData()
        {
            Console.WriteLine("Access写入数据");
        }
    }
}

这里创建了DbSqlServer、DbOracle、DbAccess三种具体产品,那么如何让客户端去调用这些数据库进行操作呢?答案是创建一个工厂创建实例。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1.SimpleFactory
{
    public class DbFactory
    {
        /// 
        /// 创建实例
        /// 
        /// 
        /// 
        public static Db CreateDb(string dbType)
        {
            Db dbInstance = null;
            switch (dbType)
            {
                case "SqlServer":
                    {
                        dbInstance = new DbSqlServer();
                    }
                    break;
                case "Oracle":
                    {
                        dbInstance = new DbOracle();
                    }
                    break;
                case "Access":
                    {
                        dbInstance = new DbAccess();
                    }
                    break;
            }
            return dbInstance;
        }
    }
}

最后在客户端调用即可:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ConsoleApplication1.SimpleFactory;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Db dbInstance = DbFactory.CreateDb("SqlServer");
            dbInstance.ReadData();
            dbInstance.WriteData();
            Console.ReadKey(true);
        }
    }
}

运行结果如下图:
C#简单工厂的实现_第1张图片
可以看到,如果将来新增了一种数据库种类,那么工厂必须修改,这也就违反了开闭原则。不过在一些小项目里面,有时候可能的情况也就那么几种,这种情况可以考虑使用简单工厂。

你可能感兴趣的:(C#,设计模式)