C#设计模式之简单工厂篇应用场景

首先定义一个接口,具体名为Idatabase,在这个接口中,定义好数据库操作的方法名和参数,以及返回值,本案例中我定义如下方法:

 

 

public interface IDatabase

 

 

{

 

 

   bool Connect(string ConnectString);

 

 

    bool Open();

 

 

    bool Command(string SQL);

 

 

    void Close();

 

 

}

 

 

重要提醒:“接口一生唯谨慎,定义大事不糊涂”,编写接口时一定要考虑周全,并对参数、返回值进行反复推敲,为什么?因为所有的实现类都是要根据该接口的规范进行代码具体编写,也即接口的定义是公用的,一旦改动了接口,后果就是所有的实现类也都必须相应调整。

 

 

 

 

然后就是编写具体的实现类了,客户要求多少不同类型的数据库,你就定义多少个Idatabase的实现类,虽然工作量大了点,可当你看到客户满意的笑容时,你心里也就会有一种由衷的幸福感,好了,SqlServer实现类代码如下:

 

 

public class SqlServer : IDatabase

 

 

    {

 

 

        SqlConnection conn;

 

 

        SqlCommand command;

 

 

 

 

        public bool Connect(string ConnectString)

 

 

        {

 

 

            try

 

 

            {

 

 

                conn = new SqlConnection(ConnectString);

 

 

                return true;

 

 

            }

 

 

            catch(SqlException)

 

 

            {

 

 

                return false;

 

 

            }

 

 

           

 

 

        }

 

 

 

 

        public bool Open()

 

 

        {

 

 

            try

 

 

            {

 

 

                conn.Open();

 

 

                return true;

 

 

            }

 

 

            catch(SqlException)

 

 

            {

 

 

                return false;

 

 

            }

 

 

        }

 

 

 

 

        public bool Command(string SQL)

 

 

        {

 

 

            try

 

 

            {

 

 

                command = new SqlCommand(SQL,conn);

 

 

                command.ExecuteNonQuery();

 

 

                return true;

 

 

            }

 

 

            catch(SqlException)

 

 

            {

 

 

                return false;

 

 

            }

 

 

        }

 

 

 

 

        public void Close()

 

 

        {

 

 

            conn.Close();

 

 

            conn.Dispose();

 

 

        }

    }

 

 

 

 

呵呵,有点长,咬着牙读完,心里明白了就会很舒服的,如果你现在有这种感觉了,好,再接再厉,再为Oracle实现类编写具体代码吧,依葫芦画瓢,大家有空就画一下吧,我就画个雏形了:

 

 

public class Oracle : IDatabase

 

 

    {

 

 

        public Oracle()

 

 

        {          

 

 

        }

 

 

 

 

        public bool Connect(string ConnectString)

 

 

        {

 

 

            return true;

 

 

        }

 

 

 

 

        public bool Open()

 

 

        {

 

 

            return true;

 

 

        }

 

 

 

 

        public bool Command(string SQL)

 

 

        {

 

 

            return true;

 

 

        }

 

 

 

 

        public void Close()

 

 

        {

 

 

 

 

        }

 

 

    }

 

 

 

 

嗯,不错,你有多少种数据库就编写不同的实现类代码吧,这里就不赘述了,接下来呢?聪明的读者一定会想到这个问题:这个接口和这么多的实现类怎么用啊?我们再定义一个称之为工厂的类,由它来决定选用哪种数据库为进行操作,这个类比较简单:

 

 

public class Factory

 

 

    {

 

 

        public static IDatabase SelectDatabase(string DatabaseType)

 

 

        {

 

 

            switch(DatabaseType)

 

 

            {

 

 

                case "SqlServer":

 

 

                    return new SqlServer();                  

 

 

                case "Oracle":

 

 

                    return new Oracle();

 

 

                default:

 

 

                    return new SqlServer();

 

 

            }

 

 

        }

 

 

    }

 

 最好的方式是不用switch,根据类名去创建,另加以下方式:

 

public class Factory

{

   public static IDatabase CreateDatabase(string ClassName)

  {

     public IDatabase myDB=null;

     try

    {

      Type type = Type.GetType(ClassName,true); //获取一个类

      myDB= (IDatabase)Activator.CreateInstance(type); //根据类创建一个实例

    }

    catch (TypeLoadException e)

      Console.WriteLine("I dont know this kind of fruit,exception caught - {0}" ,e.Message);

    return myDB;

    }

  } 

 }

 

看明白了吗?好了,我们该让尊敬的、永远高贵的客户出场了,只有他,唯有他才有决定用哪种数据库的最高权限,你看,他这样用:

 

 

public class Client

 

 

    {

 

 

        public static void Main()

 

 

        {

 

 

            //Get the database information from Web.Config.

 

 

            string DBType = ConfigurationSettings.AppSettings["DBType"];

 

 

            string DBConnectString = ConfigurationSettings.AppSettings["DBConn"];                                 

 

 

 

 

            IDatabase DB = Factory.SelectDatabase(DBType);

 

 

 

 

            //Connect the selected database.

 

 

            if(DB.Connect(DBConnectString)==false)

 

 

            {

 

 

                Console.WriteLine("The database {0} can't be connected.",DBType);

 

 

                return;

 

 

            }

 

 

 

 

            //Open database.

 

 

            if(DB.Open()==false)

 

 

            {

 

 

                Console.WriteLine("The database {0} can't be opened, the connect string is {1}.",DBType,DBConnectString);

 

 

                return;

 

 

            }

 

 

 

 

            //Execute SQL Command.

 

 

            string SQL = "update Order set price = price * 0.07 where productID = '002'";           

 

 

            if(DB.Command(SQL))

 

 

            {

 

 

                //Do something...             

 

 

            }

 

 

            else

 

 

            {

 

 

                Console.WriteLine("The Operator is not success. SQL statament is {0}",SQL);

 

 

                DB.Close();

 

 

                return;

 

 

            }

 

 

 

 

            DB.Close();

 

 

        }

 

 

    }

 

 

 

 

好了,工程峻工了,你们明白了没有?

 

 

思考题:简单工厂的应用场合和局限性?

 

 

作业题:假如要开发一个多媒体播放器,既能用Window MediaPlayer播放,又能用RealPlayer播放,还能用QuickTime播放,具体用什么播放器,由客户选择,请你画出UML图并写出代码。

 

转载于:https://www.cnblogs.com/Madream/articles/1696813.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值