Java基础之工厂模式的思考
来源:互联网 发布:淘宝店铺运营分析报告 编辑:程序博客网 时间:2024/05/20 18:19
工厂设计
首先,我们拿水果作为本次案例的一个讲解:
interface Fruits{public void eat();};class Apple implements Fruits{public void eat(){System.out.println("I want to eat Apple.....");}};class Oranger implements Fruits{public void eat(){System.out.println("I want to eat Oranger");}};
And then ,我们编写一下客户端的代码:
public class Demo5Factory { public static void mian(String[] args){ Fruits f=new Apple(); f.eat(); Fruit f2 =new Oranger(); f2.eat(); }}
这样写,我们觉的合理吗?Why ?and How to do?
Why?
Analyse;
首先,我们应该保证,客户端或者调用端的代码应该足够简洁,并且他的修改代价是最少的。客户端的代码修改起来是简单的灵活的。
假设:如果我们的是分布式的应用,我们的客户端与程序是分割2地的,如果我们要修改后面的代码,我们也必须要修改客户端的代码。但为了避免客户端的代码改写,我们可以在后面做一些改写;
How?
resolution:
/** * 定义 工厂 方法; * @author R * */class Factory{public static Fruits getInstance(String className){Fruits f=null;//注意这种写法是不可取的,应该采用这种写法 ” “。equals(className);这样可以避免抛出空指针,可悲我大3才发现并纠正这个不良的习惯啊;//if(className.equals("apple")){//f=new Apple();//}if(className.equals("Oranger")){//f=new Oranger();//}if("apple".equals(className)){f=new Apple();}if("Oranger".equals(className)){f=new Oranger();}return f;}};
这样我们的客户端就可以这样写:
public static void main(String[] args){ Fruits f1= Factory.getInstance("apple"); f1= Factory.getInstance(null); }这样写的好处,就是完全对Apple 进行了解耦,后端与前端代码完全隔离,如果要维护,我们也只需维护后端的代码即可。
用反射改进工厂模式
如果我们要添加一个新的类如 Watermelon 西瓜类 如我们就必须修改Factory 为了避免这样的事情发生,我们用反射对工厂进行以下修改:
class Factory{public static Fruit getInstance(String className){Fruit f=null;; try {f=(Fruit) Class.forName(className).newInstance();} catch (InstantiationException | IllegalAccessException| ClassNotFoundException e) {e.printStackTrace();}return f;}}我们调用是就如下实现:直接包路径+类名称
public static void main(String[] args){ Fruit f=Factory.getInstance("demoFactory001.Oranger"); f.eat(); }综上:我们这样是得到了改进,单在使用类的时候,我们必须要知道并且输入一段很长的 字符路径 使用起来就非常不方便,因此,有人提出了一个这样的设计思路;
通过配置文件+Factory来实现这种设计 ,于是呼,Spring 的 IOC 就诞生了。
模仿Spring的IOC
添加配置文件:E:\\fruit.properties
apple=demoFactory002.Appleorange=demoFactory002.Orange
class Init{public static Properties getPro(){Properties pro = new Properties() ;File f = new File("E:\\fruit.properties") ;// 找到属性文件try{if(f.exists()){// 文件存在pro.load(new FileInputStream(f)) ;// 读取属性}//else{//pro.setProperty("apple","demoFactory002.Apple") ;//pro.setProperty("orange","demoFactory002.Orange") ;//pro.store(new FileOutputStream(f),"FRUIT CLASS") ;//}}catch(Exception e){}return pro ;}};实现如下:
public static void main(String args[]){Properties pro = Init.getPro() ;Fruit f = Factory.getInstance(pro.getProperty("apple")) ;if(f!=null){f.eat() ;}}
0 0
- Java基础之工厂模式的思考
- 工厂模式的思考
- 设计模式与泡mm的关系之工厂模式及工厂模式的再思考
- Java工厂模式(基础)
- JAVA的设计模式之工厂模式
- java 基础之工厂
- java之工厂模式
- java 之 工厂模式
- JAVA之工厂模式
- JAVA之工厂模式
- java之工厂模式
- java之工厂模式
- java之工厂模式
- 从简单工厂模式到抽象工厂模式的思考
- Java的工厂模式(Factory)之二
- Java工厂模式之简单工厂模式
- Java基础----工厂设计模式
- Java模式之工厂模式
- unknow system variable 'language'
- VS2013(update4) + wdk8.1 驱动开发环境搭建
- 前缀 后缀 中缀 表达式
- aliasing demo(binding, reference)
- leetcode-190&191 Reverse Bits & Number of 1 Bits
- Java基础之工厂模式的思考
- 虚函数的使用
- C++对象缺省函数
- 树的前序,中序,后序推理问题
- dede 开源 中文分词 可用于 ecshop
- C#《猜猜看》游戏开发总结
- Java IO流详解
- Eclipse workspace error
- Sublime Text中使用正则表达式删除空行