Skip to Main Content

Chinese

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

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

702619Feb 24 2004 — edited Jun 5 2008
2003-10-18 摘自:ChinaJavaWorld 源作者:不明
走下神坛的设计模式--设计模式入门





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



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



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

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的参数,这些就是更细的实现方式了



,不必详谈了。



这就是简单工厂方法(静态工厂)的来历。





大师们用好几章写的设计模式创建模式,不会就这么简单吧?

呵呵,当然不会,且听下回分解。
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Jul 3 2008
Added on Feb 24 2004
28 comments
2,987 views