在阎宏博士的著作《Java与模式》里头的定义如下:
简单工厂方法的一般结构:
抽象产品
△
|
创建 |
工厂-------->具体产品
public class Creator
{ /**
* 静态工厂方法
*/
public static Product factory()
{
return new ConcreteProduct();
}
}
public interface Product {....}//抽象产品角色是给所有的具体产品提供一个共同的类型
public class ConcreteProduct implements Product{
public ConcreteProduct(){}
}
这是通用的简单工厂模式举例.一般在实际中会有很多中产品.可以通过传递参数方式来返回不同类型的产品.
具体的例子:
/**
* 简单工厂模式
* 用静态的方式,生产访问数据库的对象..
*/
public class DbAccessFactory {
/**
* 提供创建JDBCAccessing的方法.
* 以后可能还有XML的方法....
*/
public static final int DATA_JDBC=1;//数据库方式
public static final int DATA_XML=2;//XML方式...
public static IDBAcessProduct createDbAccessing(int datatype)
{
if(datatype ==DATA_JDBC)
{
return new JDBCAccessing();
}else if(datatype ==DATA_XML)
return new XMLDataAccess();
else
return null;
}
}
调用:DbAccessFactory .createDbAccessing(DbAccessFactory .DATA_JDBC);//参数可以在调用的地方传
(这是一年前,自己第一次学习设计模式时候写的.转眼一年了.最近项目中,同样地也遇到了类似的要使用这种比较简单的工厂模式的应用的地方.所以,又把自己学的东西拿出来温习了下.)
数据源的选择上,会经常遇到这样的问题.在这一次项目中,原来系统的连接池是采用DBCP的,后来老板听了技术顾问的话,又要求改装成C3P0的.在分析了系统的调用方式后,选择了简单工厂模式.在配置文件里头定义了一个连接池类型的参数,调用的地方是根据获得的这个参数来走具体的连接池的.所以,只要要换什么类型的连接池只要修改下配置文件就可以了.
但是任何东西应该都有他的双向性,或者说也有利弊:
缺点:如果有新产品,就要修改工厂类
但优点:无须修改客户端在一定程度上符合开闭原则.
其实很矛盾的.
可能也就应验了很多东西没办法达到最优,所以在相对情况下选择最佳比较好.
但是,因为数据库连接池的配置相对较稳定,所以简单工厂模式还是比较适用的.
因为是自学的,所以不知道理解和写法等对不对,欢迎大家指点,谢谢~