工厂模式,有用吗?_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 工厂模式,有用吗?

工厂模式,有用吗?

 2012/2/29 9:21:10  delumer  程序员俱乐部  我要评论(0)
  • 摘要:话说工厂模式,有简单工厂、工厂方法和抽象工厂,应用比较多的还是前两个,好像比较简单,也够无聊。1、那么工厂模式究竟什么意思啊?官方点就说是提供创建对象的接口,山寨点就是比较半自动地New出合理的对象。2、说说简单工厂和工厂方法长什么样子,好勒。先看下面一段代码,然后我们就码论码:packagecom.delumer.test.pattren.factory;/***简单工厂**@author东弟*@since2012-02-26*/classA{}classB{}classC{
  • 标签:模式

???????? 话说工厂模式,有简单工厂、工厂方法和抽象工厂,应用比较多的还是前两个,好像比较简单,也够无聊

?

??? 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执行删除");
	}
}

??

?

?

发表评论
用户名: 匿名