进阶过程之简单工厂模式
来源:互联网 发布:淘宝美瞳店铺哪个好 编辑:程序博客网 时间:2024/06/04 18:53
主函数
package cn.spring.library.controller; import java.lang.reflect.InvocationTargetException; import cn.spring.library.dao.IFactoryDao; import cn.spring.library.factory.DaoFactory; public class FactoryDemoTest { public static void main(String[] args) throws Exception { //利用工厂模式,客户端只需要对工厂指定你要创建的对象的名字(参数),工厂就可以根据你指定的参数动态 //创建不同的对象。当然,这些不同的对象就有不同的表现(在本例中通过play表示) playMusicBox(DaoFactory.createStaticFactory("cn.*.*.impl.StaticFacotryDao001Impl")); playMusicBox(DaoFactory.createStaticFactory("cn.*.*.impl.StaticFacotryDao002Impl")); } public static void playMusicBox(IFactoryDao factoryDao) { factoryDao.saveFactory(); } }接口
package cn.spring.library.dao;public interface IFactoryDao {/** * 注入对象 * */public void saveFactory();}实现类001
package cn.spring.library.dao.impl;import cn.spring.library.dao.IFactoryDao;public class StaticFacotryDao001Impl implements IFactoryDao {public StaticFacotryDao001Impl(){System.out.println("这是StaticFacotryDao001Impl的构造函数,不带参数");}public StaticFacotryDao001Impl(String name){System.out.println("这是StaticFacotryDao001Impl的构造函数,带参数name:"+name);}@Overridepublic void saveFactory() {System.out.println("hello world");}}
实现类002
package cn.spring.library.dao.impl;import cn.spring.library.dao.IFactoryDao;public class StaticFacotryDao002Impl implements IFactoryDao {public StaticFacotryDao002Impl(){System.out.println("这是StaticFacotryDao001Impl的构造函数,不带参数");}public StaticFacotryDao002Impl(String name){System.out.println("这是StaticFacotryDao001Impl的构造函数,带参数name:"+name);}@Overridepublic void saveFactory() {System.out.println("hello world Ketty");}}工厂控制器
package cn.spring.library.factory;import java.lang.reflect.Constructor;import java.lang.reflect.InvocationTargetException;import cn.spring.library.dao.IFactoryDao;import cn.spring.library.dao.impl.StaticFacotryDao002Impl;import cn.spring.library.dao.impl.StaticFacotryDao001Impl;public class DaoFactory { /** * 静态工厂 * */ public static final IFactoryDao getStaticFactoryDao001Impl(){ return new StaticFacotryDao001Impl(); } public static final IFactoryDao getStaticFactoryDao002Impl(){ return new StaticFacotryDao002Impl(); } /** * 静态工厂控制 * 根据传递过来的不同实现类,返回不同的实例 * @throws InvocationTargetException * @throws IllegalArgumentException * @throws SecurityException * @throws NoSuchMethodException * */ public static final IFactoryDao createStaticFactory(String name) throws Exception { // 这边使用的是Java的Reflection机制来产生实例 // 不过客户端不用管啦 // 以后就算改变了这边的程式,客户端程式是不用更改的 //调用不带参数 //return (IFactoryDao) Class.forName(name).newInstance(); //调用带参数 Class<?> c=Class.forName(name); Constructor<?> cst; cst = c.getDeclaredConstructor(new Class[]{String.class});cst.setAccessible(true); return (IFactoryDao)cst.newInstance(new Object[]{"hansen"}); } }输出
这是StaticFacotryDao001Impl的构造函数,带参数name:hansenhello world这是StaticFacotryDao002Impl的构造函数,带参数name:hansenhello world Ketty
分析:
工厂角色:被客户端直接调用,根据客户端指定传入的参数,动态创建客户端需要的对象
抽象产品角色:所有对象的父类(接口)
具体产品角色:即工厂的创建目标,工厂创建的对象就是这些具体类的对象。
可以看出,客户端只面对工厂,不用管产品的具体细节,客户只需向工厂要求你需要什么,其他的事情都交给工厂了。
优点:
通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各
自的职责和权利。(简单地说,你到肯德基去只需要说你要鸡腿还是鸡翅就行了,不需要去管鸡腿和鸡翅是怎么做出来的,工厂为你提供了这样一个界面)
不足:
由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新
的类,则就需要改变工厂类了。
当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模
块功能的蔓延,对系统的维护和扩展非常不利;
使用场景
工厂类负责创建的对象比较少;
客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;
由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。
从上面的例子也可以看出来,工厂类往往是用反射机制来产生具体对象的。(因为不同类都继承自同一接口),故其扩展性很有限,产品种类必须是事先就知道的哪几种,什么时候你想要添加一个不是公共接口下的具体类就不行了。
另外,如果你不用反射机制,也不要公共接口,在工厂中使用其他逻辑(例如判断传入的字符串)来根据用户参数创建对象也行,那样扩展性也是很糟糕的,逻辑和添加只会越来多。
0 0
- 进阶过程之简单工厂模式
- 工厂模式之简单工厂模式
- 工厂模式之--简单工厂模式
- 工厂模式之简单工厂模式
- 设计模式 之简单工厂+ 工厂模式
- Java工厂模式之简单工厂模式
- java 工厂模式之简单工厂(01)
- 【Java】Java工厂模式之简单工厂
- 工厂三兄弟之简单工厂模式
- 工厂三兄弟之简单工厂模式
- 工厂三兄弟之简单工厂模式
- 文工厂模式之简单工厂
- C++设计模式之简单工厂、工厂模式、抽象工厂
- 【趣解】工厂模式之简单工厂、工厂方法模式
- 简单工厂模式之窗口
- 设计模式 之 简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 四种启动模
- 6-Hive 分区
- LeetCode 136 Single Number
- iOS开发网络篇—文件下载(暂停和恢复)
- 机器学习 第五天 17/03/31
- 进阶过程之简单工厂模式
- Python-Image 基本的图像处理操作
- UVA-10815
- Algorithm by C/C++ : Callback function
- Android UncaughtExceptionHandler 解决未捕获异常,防止软件报”停止运行“
- Caffe
- Qt2D绘图详解
- Objective-C文件和目录操作,IOS文件操作,NSFileManager使用文件操作
- 开源网站收集