小结-工厂设计模式
来源:互联网 发布:淘宝代付申请超限 编辑:程序博客网 时间:2024/06/04 19:39
利用此设计模式完整阐述反射在开发之中的实际意义。
如下例:
package pattern;//工厂设计模式interface Fruit{ public void eat();}class Apple implements Fruit{ @Override public void eat() { System.out.println("吃苹果"); }}class Orange implements Fruit{ @Override public void eat() { System.out.println("吃橘子"); }}public class FactoryModel { public static void main(String[] args){ //Fruit f = new Apple();//想吃苹果 Fruit f = new Orange();//想吃橘子 f.eat(); }}
注意:任何软件设计都不应该以更改用户使用习惯为前提。
主方法实际上是一个客户端,客户端不应该处理任何复杂操作,如果现在想吃哪个new哪个,这样去更换一个子类,修改主方法(客户端代码),合适吗?
此时的客户端代码,一个接口的对象实例化操作直接与一个具体的子类通过关键字new耦合了。所以说要想更换子类,那么必须由客户端去执行。
JVM提供给我们很好的解决耦合方案,所有java程序实际上都是通过JVM间接运行在操作系统上,从而,只要JAM支持不变,那么程序可以任意的移植。如果说现在程序直接与操作系统完全捆绑在一起,那么程序无法修改,也就是传统开发A->B。如果想做松耦合的代码,A–>C–>B
,中间出现一个断层C,而后这个断层负责所有连接操作。
改动后如下:工厂设计–设计中间的环节
//工厂设计模式interface Fruit{ public void eat();}class Apple implements Fruit{ @Override public void eat() { System.out.println("吃苹果"); }}class Orange implements Fruit{ @Override public void eat() { System.out.println("吃橘子"); }}class Factory { public static Fruit getIns(String className){ if("apple".equals(className)){ return new Apple(); } if("orange".equals("orange")){ return new Orange(); } return null; }}public class FactoryModel { public static void main(String[] args){ Fruit f = Factory.getIns("orange"); f.eat(); }}
按以上代码修改后可以感受到,客户端调用变容易了。可是它属于简单的工厂设计,这种设计的特点是:直接利用new与if判断来决定使用的子类,适用于接口的子类少的情况,不利于扩充。如果Fruit有无限多个子类,都要在工厂类里面修改就很麻烦了。所以,继续修改代码如下:利用反射解决问题
//修改处class Factory { public static Fruit getIns(String className){ Fruit f = null; try{ Class<?> cls = Class.forName(className); f = (Fruit) cls.newInstance(); }catch(Exception e){ e.printStackTrace(); } return f; }}public class FactoryModel { public static void main(String[] args){ //包.类 Fruit f = Factory.getIns("pattern.Banna"); f.eat(); }}
这样修改后,即使产生再多的Fruit接口子类,工厂类也同样支持所有子类实例化操作。此时的代码暂时完善了。包.类Fruit f = Factory.getIns("pattern.Banna");
太麻烦,可以使用文件操作简写
工厂模式最重要特点:利用工厂类取得接口的实例化对象,实现接口和子类间解耦合操作。(解耦合;取得接口对象优先使用此模式;使用反射易于扩充)
0 0
- 小结-工厂设计模式
- 工厂设计模式最佳实践小结
- C#设计模式学习小结之一 工厂模式
- 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别
- 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别
- 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别【转】
- 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别 (转)
- 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别
- JAVA设计模式:简单工厂、工厂方法、抽象工厂之小结与区别
- 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别
- 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别 (转)
- 设计模式-简单工厂、工厂方法、抽象工厂之小结与区别
- 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别 (转)
- 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别
- 【转】设计模式:简单工厂、工厂方法、抽象工厂之小结与区别
- 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别
- 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别 (转)
- 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别
- 分页插件PageHelper
- 查看linux硬盘使用率
- 正则表达式语法简单写法
- 树莓派小显示器模拟带温度显示的时钟
- 函数式接口
- 小结-工厂设计模式
- Android 简单的拍照并获取图片
- 使用d3.js实现力矩散点图+图例
- 手把手教你详细的硬件电路设计 - 全文
- 配置pip国内源
- 独家首创|万众云集创业估值 更简单更合理
- 看懂UML类图和时序图
- AIDL的使用情况和实例介绍
- org.apache.catalina.connector.ClientAbortException: java.io.IOException: 您的主机中的软件中止了一个已建立的连接