C# · 12月 20, 2021

C#设计模式之简单工厂篇(转载)

 首先定义一个接口,具体名为Idatabase,在这个接口中,定义好数据库操作的方法名和参数,以及返回值,本案例中我定义如下方法:
<p style=”FONT-SIZE: 10pt”>public interface IDatabase

<p style=”FONT-SIZE: 10pt”>{

<p style=”FONT-SIZE: 10pt”>   bool Connect(string ConnectString);

<p style=”FONT-SIZE: 10pt”>    bool open();

<p style=”FONT-SIZE: 10pt”>    bool Command(string sql);

<p style=”FONT-SIZE: 10pt”>    void Close();

<p style=”FONT-SIZE: 10pt”>}

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

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

<p style=”FONT-SIZE: 10pt”>public class sqlServer : IDatabase

<p style=”FONT-SIZE: 10pt”>    {

<p style=”FONT-SIZE: 10pt”>        sqlConnection conn;

<p style=”FONT-SIZE: 10pt”>        sqlCommand command;

<p style=”FONT-SIZE: 10pt”>        public bool Connect(string ConnectString)

<p style=”FONT-SIZE: 10pt”>        {

<p style=”FONT-SIZE: 10pt”>            try

<p style=”FONT-SIZE: 10pt”>            {

<p style=”FONT-SIZE: 10pt”>                conn = new sqlConnection(ConnectString);

<p style=”FONT-SIZE: 10pt”>                return true;

<p style=”FONT-SIZE: 10pt”>            }

<p style=”FONT-SIZE: 10pt”>            catch(sqlException)

<p style=”FONT-SIZE: 10pt”>            {

<p style=”FONT-SIZE: 10pt”>                return false;

<p style=”FONT-SIZE: 10pt”>            }

<p style=”FONT-SIZE: 10pt”> 

<p style=”FONT-SIZE: 10pt”>        }

<p style=”FONT-SIZE: 10pt”>        public bool open()

<p style=”FONT-SIZE: 10pt”>        {

<p style=”FONT-SIZE: 10pt”>            try

<p style=”FONT-SIZE: 10pt”>            {

<p style=”FONT-SIZE: 10pt”>                conn.open();

<p style=”FONT-SIZE: 10pt”>                return true;

<p style=”FONT-SIZE: 10pt”>            }

<p style=”FONT-SIZE: 10pt”>            catch(sqlException)

<p style=”FONT-SIZE: 10pt”>            {

<p style=”FONT-SIZE: 10pt”>                return false;

<p style=”FONT-SIZE: 10pt”>            }

<p style=”FONT-SIZE: 10pt”>        }

<p style=”FONT-SIZE: 10pt”>        public bool Command(string sql)

<p style=”FONT-SIZE: 10pt”>        {

<p style=”FONT-SIZE: 10pt”>            try

<p style=”FONT-SIZE: 10pt”>            {

<p style=”FONT-SIZE: 10pt”>                command = new sqlCommand(sql,conn);

<p style=”FONT-SIZE: 10pt”>                command.ExecuteNonQuery();

<p style=”FONT-SIZE: 10pt”>                return true;

<p style=”FONT-SIZE: 10pt”>            }

<p style=”FONT-SIZE: 10pt”>            catch(sqlException)

<p style=”FONT-SIZE: 10pt”>            {

<p style=”FONT-SIZE: 10pt”>                return false;

<p style=”FONT-SIZE: 10pt”>            }

<p style=”FONT-SIZE: 10pt”>        }

<p style=”FONT-SIZE: 10pt”>        public void Close()

<p style=”FONT-SIZE: 10pt”>        {

<p style=”FONT-SIZE: 10pt”>            conn.Close();

<p style=”FONT-SIZE: 10pt”>            conn.Dispose();

<p style=”FONT-SIZE: 10pt”>        }

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

<p style=”FONT-SIZE: 10pt”>public class Oracle : IDatabase

<p style=”FONT-SIZE: 10pt”>    {

<p style=”FONT-SIZE: 10pt”>        public Oracle()

<p style=”FONT-SIZE: 10pt”>        {

<p style=”FONT-SIZE: 10pt”>        }

<p style=”FONT-SIZE: 10pt”>        public bool Connect(string ConnectString)

<p style=”FONT-SIZE: 10pt”>        {

<p style=”FONT-SIZE: 10pt”>            return true;

<p style=”FONT-SIZE: 10pt”>        }

<p style=”FONT-SIZE: 10pt”>        public bool open()

<p style=”FONT-SIZE: 10pt”>        {

<p style=”FONT-SIZE: 10pt”>            return true;

<p style=”FONT-SIZE: 10pt”>        }

<p style=”FONT-SIZE: 10pt”>        public bool Command(string sql)

<p style=”FONT-SIZE: 10pt”>        {

<p style=”FONT-SIZE: 10pt”>            return true;

<p style=”FONT-SIZE: 10pt”>        }

<p style=”FONT-SIZE: 10pt”>        public void Close()

<p style=”FONT-SIZE: 10pt”>        {

<p style=”FONT-SIZE: 10pt”>        }

<p style=”FONT-SIZE: 10pt”>    }

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

<p style=”FONT-SIZE: 10pt”>public class Factory

<p style=”FONT-SIZE: 10pt”>    {

<p style=”FONT-SIZE: 10pt”>        public static IDatabase SelectDatabase(string DatabaseType)

<p style=”FONT-SIZE: 10pt”>        {

<p style=”FONT-SIZE: 10pt”>            switch(DatabaseType)

<p style=”FONT-SIZE: 10pt”>            {

<p style=”FONT-SIZE: 10pt”>                case “sqlServer”:

<p style=”FONT-SIZE: 10pt”>                    return new sqlServer();

<p style=”FONT-SIZE: 10pt”>                case “Oracle”:

<p style=”FONT-SIZE: 10pt”>                    return new Oracle();

<p style=”FONT-SIZE: 10pt”>                default:

<p style=”FONT-SIZE: 10pt”>                    return new sqlServer();

<p style=”FONT-SIZE: 10pt”>            }

<p style=”FONT-SIZE: 10pt”>        }

<p style=”FONT-SIZE: 10pt”>    }看明白了吗?好了,我们该让尊敬的、永远高贵的客户出场了,只有他,唯有他才有决定用哪种数据库的最高权限,你看,他这样用:

<p style=”FONT-SIZE: 10pt”>public class Client

<p style=”FONT-SIZE: 10pt”>    {

<p style=”FONT-SIZE: 10pt”>        public static void Main()

<p style=”FONT-SIZE: 10pt”>        {

<p style=”FONT-SIZE: 10pt”>            //Get the database information from Web.Config.

<p style=”FONT-SIZE: 10pt”>            string DBType = ConfigurationSettings.AppSettings[“DBType”];

<p style=”FONT-SIZE: 10pt”>            string DBConnectString = ConfigurationSettings.AppSettings[“DBConn”];

<p style=”FONT-SIZE: 10pt”>            IDatabase DB = Factory.SelectDatabase(DBType);

<p style=”FONT-SIZE: 10pt”>            //Connect the selected database.

<p style=”FONT-SIZE: 10pt”>            if(DB.Connect(DBConnectString)==false)

<p style=”FONT-SIZE: 10pt”>            {

<p style=”FONT-SIZE: 10pt”>                Console.WriteLine(“The database {0} <a href=”mailto:can@#t”><font color=”#000000″ size=”2″>can@#t be connected.”,DBType);

<p style=”FONT-SIZE: 10pt”>                return;

<p style=”FONT-SIZE: 10pt”>            }

<p style=”FONT-SIZE: 10pt”>            //Open database.

<p style=”FONT-SIZE: 10pt”>            if(DB.open()==false)

<p style=”FONT-SIZE: 10pt”>            {

<p style=”FONT-SIZE: 10pt”>                Console.WriteLine(“The database {0} <a href=”mailto:can@#t”><font color=”#000000″ size=”2″>can@#t be opened,the connect string is {1}.”,DBType,DBConnectString);

<p style=”FONT-SIZE: 10pt”>                return;

<p style=”FONT-SIZE: 10pt”>            }

<p style=”FONT-SIZE: 10pt”>            //Execute sql Command.

<p style=”FONT-SIZE: 10pt”>            string sql = “update Order set price = price * 0.07 where productID = @#002@#”;

<p style=”FONT-SIZE: 10pt”>            if(DB.Command(sql))

<p style=”FONT-SIZE: 10pt”>            {

<p style=”FONT-SIZE: 10pt”>                //Do something…

<p style=”FONT-SIZE: 10pt”>            }

<p style=”FONT-SIZE: 10pt”>            else

<p style=”FONT-SIZE: 10pt”>            {

<p style=”FONT-SIZE: 10pt”>                Console.WriteLine(“The Operator is not success. sql statament is {0}”,sql);

<p style=”FONT-SIZE: 10pt”>                DB.Close();

<p style=”FONT-SIZE: 10pt”>                return;

<p style=”FONT-SIZE: 10pt”>            }

<p style=”FONT-SIZE: 10pt”>            DB.Close();

<p style=”FONT-SIZE: 10pt”>        }

<p style=”FONT-SIZE: 10pt”>    }

<p style=”FONT-SIZE: 10pt”>    好了,工程峻工了,你们明白了没有?

<p style=”FONT-SIZE: 10pt”>    思考题:简单工厂的应用场合和局限性?

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