首页 > 开发 > 综合 > 正文

C#设计模式之简单工厂篇

2024-07-21 02:17:35
字体:
来源:转载
供稿:网友
国内最大的酷站演示中心!

首先定义一个接口,具体名为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();

            }

        }

    }

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

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图并写出代码。                                                         待续…

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表