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

下面只是一点对设计模式的简单理解,只希望能够使初学者比较快的了解一下设计模式的基本内容,如果要深入理解,还是请看大师们的经典之作。

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

我们的目标就是代码重用和维护方便,说白了,就是
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的参数,这些就是更细的实现方式了,不必详谈了。

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


大师们用好几章写的设计模式创建模式,不会就这么简单吧?
呵呵,当然不会,且听下回分解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值