首先,为什么要有设计模式,主要的目的就是软件重用了。辛辛苦苦写的代码,没怎么用就扔掉,不是太可惜了么。但是代码质量太差,用了
会出错也不行。所以我们要尽量写出可以重用的代码。
我们的目标就是代码重用和维护方便,说白了,就是
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的参数,这些就是更细的实现方式了
,不必详谈了。
这就是简单工厂方法(静态工厂)的来历。
会出错也不行。所以我们要尽量写出可以重用的代码。
我们的目标就是代码重用和维护方便,说白了,就是
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的参数,这些就是更细的实现方式了
,不必详谈了。
这就是简单工厂方法(静态工厂)的来历。