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