???????? 话说工厂模式,有简单工厂、工厂方法和抽象工厂,应用比较多的还是前两个,好像比较简单,也够无聊。
?
??? 1、那么工厂模式究竟什么意思啊?
????????? 官方点就说是提供创建对象的接口,山寨点就是比较半自动地New出合理的对象。
?
??? 2、说说简单工厂和工厂方法长什么样子,好勒。
?????????? 先看下面一段代码,然后我们就码论码:
?????????? ?
package com.delumer.test.pattren.factory;
/**
* 简单工厂
*
* @author 东弟
* @since 2012-02-26
*/
class A{}
class B{}
class C{}
public class ObjectFactory
{
public static Object createObject(String name)
{
Object obj = null;
if(name.equals("A")) obj = new A();
if(name.equals("B")) obj = new B();
if(name.equals("C")) obj = new C();
return obj;
}
}
??????????? 怎么样,熟悉吧,是不是忒没用、倍无聊的,但是没错啊,这就是简单工厂啦。
????????????那另外工厂方法呢,就是上例中的类A、B和C都实现一个接口,createObject返回的是这个接口类型对象。
?
??????????? 好了,就这样吧,真的没什么好说的,再说我都无语了,那还又有个什么抽象工厂,哎,真的服了,没啥用啊。
?????????? ?随便忽悠忽悠吧,勉强勉强。
?
?????????? 抽象工厂,多了一个抽象,诶,来了,可能就是抽象这个词,代表了这个模式的核心。
?
?????????? 抽象什么,抽象这个工厂啊,那意思就是说,这个工厂不是实实在在地,只是定义了一个规范,让能够实实在在
?????????? 生产对象的工厂去膜拜它,故而我们就会想定义一个抽象类或者接口,然后有各种功能的工厂继承它或者实现它。
?
?????????? 不就完了,然后怎么生产,还是跟简单工厂一样,用if/else、swith,或者动态类装载实现。
?
?????????? 那其实实际应用多多少少还是有的,只不过不要太相信模式,能解决问题才是王道,管它魔不磨死的。
?
???????????我下面提供一个实现动态切换数据库操作类的例子,我也不知道魔不不磨死的啊,好像磨死吧。
?
?????????? 稍微描述一下吧,定义一个抽象产品IDao,一个抽象工厂DaoFactory,然后两个具体工厂继承它,然后具体工厂
?????????? 就会生产具体的产品出来,也就是OracleDao或者MySqlDao,大概这样吧。
?
??????????? 不过我真的觉得不靠谱,不知为什么,反正我无语了,完!
??????????
????????????
package com.delumer.test.pattren.factory;
/**
* 测试抽象工厂
*
* @author 东弟
* @since 2012-02-26
*/
public class Test
{
public static void main(String[] args)
{
//变量config的值通过读取配置文件获得
String config = "com.delumer.test.pattren.factory.OracleDaoFactory";
//以下代码在项目中保持不变
DaoFactory daoFactory = DaoFactory.createDaoFactory(config);
IDao dao = daoFactory.createDao();
dao.insert();
dao.update();
dao.delete();
}
}
?
package com.delumer.test.pattren.factory;
/**
* 抽象的产品操作
*
* @author 东弟
* @since 2012-02-26
*/
public interface IDao
{
public void insert();
public void update();
public void delete();
}
?
package com.delumer.test.pattren.factory;
/**
* 抽象工厂
*
* @author 东弟
* @since 2012-02-26
*/
public abstract class DaoFactory
{
public static DaoFactory createDaoFactory(String className)
{
DaoFactory daoFactory = null;
try
{
daoFactory = (DaoFactory)Class.forName(className).newInstance();
}
catch(Exception e)
{
e.printStackTrace();
}
return daoFactory;
}
public abstract IDao createDao();
}
??
package com.delumer.test.pattren.factory;
/**
* 具体工厂
*
* @author 东弟
* @since 2012-02-26
*/
public class OracleDaoFactory extends DaoFactory
{
public IDao createDao()
{
return new OracleDao();
}
}
?
package com.delumer.test.pattren.factory;
/**
* 具体工厂
*
* @author 东弟
* @since 2012-02-26
*/
public class MySqlDaoFactory extends DaoFactory
{
public IDao createDao()
{
return new MySqlDao();
}
}
?
package com.delumer.test.pattren.factory;
/**
* 具体产品
*
* @author 东弟
* @since 2012-02-26
*/
public class OracleDao implements IDao
{
public void insert()
{
System.out.println("Oracle执行插入");
}
public void update()
{
System.out.println("Oracle执行更新");
}
public void delete()
{
System.out.println("Oracle执行删除");
}
}
?
package com.delumer.test.pattren.factory;
/**
* 具体产品
*
* @author 东弟
* @since 2012-02-26
*/
public class MySqlDao implements IDao
{
public void insert()
{
System.out.println("Mysql执行插入");
}
public void update()
{
System.out.println("Mysql执行更新");
}
public void delete()
{
System.out.println("Mysql执行删除");
}
}
??
?
?