走下神坛的设计模式--设计模式入门(1)

首先,为什么要有设计模式,主要的目的就是软件重用了。辛辛苦苦写的代码,没怎么用就扔掉,不是太可惜了么。但是代码质量太差,用了 



会出错也不行。所以我们要尽量写出可以重用的代码。 



我们的目标就是代码重用和维护方便,说白了,就是

1.少写重复代码

2.尽量不修改已经完成的代码

3.如果要增加功能,最好是通过添加新的类,而不是修改现有代码。

4.一定要修改的话,也要容易修改,并且不会或尽量少影响到其他。

5.... 



设计模式就是教我们如何在前辈们的经验上,写出可以满足上面条件的代码。

现在都是面向对象了,所以主要考虑的都是基于对象的重用。使用一个对象分为3步:

1.创建/取得一个对象

2.操作这个对象的方法以改变对象状态

3.销毁这个对象。

所以如何创建一个对象就是第一个要考虑的问题,也就有了创建模式。

操作对象呢就是行为模式了。

销毁一个对象比较容易,但是会经常忘,小心点就是了,其模式大概不多。java基本上不用太多考虑这个问题,所以也就管杀不管埋了。

对象之间还有一些复杂关系,来描述一些复杂的事务,当然就是结构模式了。 



既然创建对象是第一步,那就从创建模式说起。如果创建一个对象呢,最简单也是最标准的当然是new了

MyClass obj=new MyClass(); 



有什么问题么?如果就这么简单当然没问题,但是如果创建一个对象不这么简单呢?比如你要建一个数据库连接,那可不是一个new就能完成的 





如下:

   String    drv = "com.microsoft.jdbc.sqlserver.SQLServerDriver";

   String    url = "jdbc:microsoft:sqlserver://127.0.0.1:1433";

   String    uid = "sa";

   String    pwd = "123456"; 



   Connection cn=null;

   try

   {

     Class.forName(drv).newInstance();

     cn=DriverManager.getConnection(url,uid,pwd);

   }

   catch (Exception e)

   {

   e.printStackTrace();

   } 



这么麻烦,你不会每次生成一个数据库连接的时候,都写这么多代码吧?怎么办,粘贴拷贝是个办法,不过一般都是写个方法了。方法不会独 



立存在,需要一个class 



public DBManager

{

   public static Connection getCn()

   {

   String    drv = "com.microsoft.jdbc.sqlserver.SQLServerDriver";

   String    url = "jdbc:microsoft:sqlserver://127.0.0.1:1433";

   String    uid = "sa";

   String    pwd = "123456"; 



   Connection cn=null;

   try

   {

     Class.forName(drv).newInstance();

     cn=DriverManager.getConnection(url,uid,pwd);

   }

   catch (Exception e)

   {

   e.printStackTrace();

   }

   return cn;

   }





这样每次不用ctrl+c,ctrl+v了。你的代码里都是方法调用,看起来也简洁一些。这就是一个工厂方法,而且是静态工厂,为什么用静态工厂, 



因为没什么状态需要工厂保存,所以用静态方法比较好,还不用创建一个工厂实例。为啥叫工厂,这是个比喻了,工厂生产产品,在这里就专 



门生产对象了。比喻比较恰当,也好记一点。最好我们把例子改一下名字。

public DBFactory

{

   public static Connection getCn()

   {

   String    drv = "com.microsoft.jdbc.sqlserver.SQLServerDriver";

   String    url = "jdbc:microsoft:sqlserver://127.0.0.1:1433";

   String    uid = "sa";

   String    pwd = "123456"; 



   Connection cn=null;

   try

   {

     Class.forName(drv).newInstance();

     cn=DriverManager.getConnection(url,uid,pwd);

   }

   catch (Exception e)

   {

   e.printStackTrace();

   }

   return cn;

   }





推而广之,凡是不是调用者用new生成,而用其他的对象间接生成的对象,都可以看作是广义工厂方法。凡是不能简单的用一个new生成的对象 



都可以考虑用工厂方法。好处就是,嘿嘿,少写几行代码了。另外,创建对象的方法有改变时,只改工厂,调用者不用改。别忘了我们的目标 



是代码重用。 



如果一个工厂只生产一个产品,那不成作坊了,所以让这个工厂多干点事吧,上面的工厂要是能生成不同数据库的连接该多好啊。可以啊,代 



码修改一下:

public DBFactory

{

   public static Connection getCn(drv,url,uid,pwd)

   { 



   Connection cn=null;

   try

   {

     Class.forName(drv).newInstance();

     cn=DriverManager.getConnection(url,uid,pwd);

   }

   catch (Exception e)

   {

   e.printStackTrace();

   }

   return cn;

   }

}

于是这个工厂就可以生产各种数据库连接了。凑巧的是,jdbc可以用java的反射机制,实现一段代码,生成不同的jdbc,如果不是jdbc,很有 



可能要通过if else写好多代码了。不过总好过每个地方都粘贴代码吧。另外还可以通过配置文件生成jdbc的参数,这些就是更细的实现方式了 



,不必详谈了。 



这就是简单工厂方法(静态工厂)的来历。
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页