???????? 话说工厂模式,有简单工厂、工厂方法和抽象工厂,应用比较多的还是前两个,好像比较简单,也够无聊。
?
??? 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执行删除"); } }
??
?
?