锁定老帖子 主题:关于简单工厂应用的心得
精华帖 (0) :: 良好帖 (0) :: 新手帖 (3) :: 隐藏帖 (2)
|
|
---|---|
作者 | 正文 |
发表时间:2010-05-25
package com.rose.common.frame.factory; /** * <p>Title: 运营监控插件 系统模块</p> * <p>Description: 系统信息</p> * <p>Copyright: Copyright (c) 2009</p> * @author qiuy * @version 1.0 */ public interface SystemService { /** * <p>重启操作系统</p> */ void restartSystem(); /** * <p>关闭操作系统</p> */ void shutdownSystem(); /** * <p>重启应用系统</p> */ void restartApplicationSystem(); /** * <p>关闭应用系统</p> */ void shutdownApplicationSystem(); /** * <p>取消命令</p> */ void rollbackCommand(); /** * <p>输出最后100行日志</p> * @return StringBuffer 日志字符串 */ public StringBuffer getLastIndex100Log(int index,String date); } 接下来是一个window系统的接口实现类 package com.rose.common.frame.factory; public class WindowsSystemServiceImpl implements SystemService { public void restartSystem() { } public void shutdownSystem() { } public void restartApplicationSystem() { } public void shutdownApplicationSystem() { } public void rollbackCommand() { } public StringBuffer getLastIndex100Log(int index,String date) { return null; } public static void main(String[] args) { } } 下面是linux系统的接口实现类 package com.rose.common.frame.factory; public class LinuxSystemServiceImpl implements SystemService { public void restartSystem() { } public void shutdownSystem() { } public void rollbackCommand() { } public void restartApplicationSystem() { } public void shutdownApplicationSystem() { } public StringBuffer getLastIndex100Log(int index,String date) { return null; } } 下面就是一个简单工厂获得系统实例 package com.rose.common.frame.factory; import java.io.IOException; /** * @author qiuy */ public class SystemInstanceFactory { private static SystemService systemService; public static SystemService getSystemService() { return systemService; } public static void setSystemService(SystemService systemService) { SystemInstanceFactory.systemService = systemService; } /** * <p>获取系统实例</p> * @return * @throws IOException */ public static SystemService getSystemInstance() throws IOException{ String strOSName = System.getProperty("os.name"); if (systemService == null) { if(strOSName.toLowerCase().startsWith("windows")) { systemService = new WindowsSystemServiceImpl(); //创建windows系统实例 }else if(strOSName.toLowerCase().startsWith("linux")) { systemService = new LinuxSystemServiceImpl(); //创建linux系统实例 }else { throw new IOException("unknown operating system: " + strOSName); } } return systemService; } } ok以上代码就是一个典型的简单工厂应用,个人认为这样写很实用,测试代码如下。 package com.rose.common.frame.factory; import java.io.IOException; public class TestFactory { public static void main(String[] args) { SystemService systemService = null; try { systemService = SystemInstanceFactory.getSystemInstance(); } catch (IOException e) { e.printStackTrace(); } systemService.shutdownSystem();//关闭操作系统,不同操作系统调用不同命令。 } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-05-26
so what
|
|
返回顶楼 | |
发表时间:2010-05-26
心得在哪呢?这只是典型应用啊。
另外这种简单工厂完全可以用map类去掉if-else, 更简单直观。 接口设计时,避免条件hard code, 把最后100条log写死不好, 不如作为可变参数n |
|
返回顶楼 | |
发表时间:2010-05-26
berlou 写道 心得在哪呢?这只是典型应用啊。
另外这种简单工厂完全可以用map类去掉if-else, 更简单直观。 接口设计时,避免条件hard code, 把最后100条log写死不好, 不如作为可变参数n 问一下 如何使用map,真心求教,谢谢 |
|
返回顶楼 | |
发表时间:2010-05-26
别说求教,不敢当。
map很简单,你的if else条件就是key, 里面的内容就封装成一个factory。 简单的说,就是你的简单工厂的基础上,再工厂一下。 比如map.put("linux", linuxServiceFactory) map.put("windows", windowsServiceFacotry) 加一个客户端接口 OsServiceFactory getOsServiceFactory(String s) 客户端代码: OsServiceFactory factory = getOsServiceFactory(s); factory.createService(); xxx xxx. |
|
返回顶楼 | |
发表时间:2010-05-26
if else其实不是不能用,只不过当你的系统扩张的很迅速的时候, 多个分支的if else出现在多个方法里的时候, 可能造成指数级的分支数量(笛卡尔积)。而修改某一个东西的时候,你可能要修改N多个分支。
|
|
返回顶楼 | |
发表时间:2010-05-26
这个是我的心得, 你可以自己判断对与不对,哈哈。
|
|
返回顶楼 | |
发表时间:2010-05-26
berlou 写道 if else其实不是不能用,只不过当你的系统扩张的很迅速的时候, 多个分支的if else出现在多个方法里的时候, 可能造成指数级的分支数量(笛卡尔积)。而修改某一个东西的时候,你可能要修改N多个分支。
if else不能用得话,那不就不是简单工厂了么? |
|
返回顶楼 | |
发表时间:2010-05-26
beneo 写道 berlou 写道 if else其实不是不能用,只不过当你的系统扩张的很迅速的时候, 多个分支的if else出现在多个方法里的时候, 可能造成指数级的分支数量(笛卡尔积)。而修改某一个东西的时候,你可能要修改N多个分支。
if else不能用得话,那不就不是简单工厂了么? 看来你还是在纠结于模式, 模式是用来更好的解决问题的。 虽然楼主在谈简单工厂模式, 但是既然是谈心得, 何不谈谈如何更好的应用?不然有什么价值?把书本上的gof23搬过来岂不是更好? 我已经控制话题的扩散性了。 其实这个问题,深入谈下去还会有许多扩散性: 比如,如果serviceImpl是singleton的话,map里直接放service的实例就可以了。而prototype的话,还是放一个factory好一些。 说的可能复杂了,但是有人也说过,简单工厂根本算不上什么设计模式,因为它基本没什么明显的优越性。 |
|
返回顶楼 | |
发表时间:2010-05-26
声明一点,如果纠结于设计模式的严格定义,那说明我们不在一个沟通渠道上, 不要争论了。
我看重的是用模式,或者是用OOD去解决实际问题。为了谈模式而谈模式,基本上没有任何意义。 |
|
返回顶楼 | |