设计模式——简单工厂模式
来源:互联网 发布:linux如何查看路由走向 编辑:程序博客网 时间:2024/06/05 06:47
简单工厂模式:如果代码中到处都充斥着对象的创建和初始化工作,会使代码看起来很凌乱,而且不便于维护,因为只要有初始化参数发生变化,所有代码都跟着变,此时就需要将对象的创建和使用分离开,就是简单的工厂模式。
- 简单工厂模式是将对象产生的细节进行隐藏,客户端只负责调用即可。又叫静态工厂方法模式,它定义一个具体的工厂类来负责创建类的对象。
- 简单工厂模式由3部分组成:工厂类、抽象类和实现抽象类的具体类
示例:
Product.java
public interface Product { public String operation1();}
Product1.java
public class Product1 implements Product { public String operation1(){ return "Product1生产"; }}
Product2.java
public class Product2 implements Product { public String operation1(){ return "Product2生产"; }}
SimpleFactory .java
public class SimpleFactory { /*根据参数创建不同的对象*/ public static Product createProduct(String productName){ if("1".equals(productName)) return new Product1(); else if("2".equals(productName)) return new Product2(); return null; }}
Client .java
public class Client { public static void main(String[] args){ SimpleFactory sf=new SimpleFactory(); Product pro=sf.createProduct("1"); System.out.println(pro.operation1()); pro=sf.createProduct("2"); System.out.println(pro.operation1()); }}
测试结果:
Product1生产
Product2生产
从以上代码可以看出,simplefactory.java工厂类中有很多的条件判断,随着对象越来越多,条件判断也会逐渐增多,会导致工厂类很庞大,不利于后期代码维护,为了减少条件判断可以使用Java的反射机制,将条件改为Java反射
修改:
SimpleFactory .java
public class SimpleFactory { public Product createProduct(String type){ Product pro=null; try{ //采用java反射来创建类的实例 pro=(Product)Class.forName(type).newInstance(); }catch(InstantiationException ex){ ex.printStackTrace(); }catch(IllegalAccessException ex){ ex.printStackTrace(); }catch(ClassNotFoundException ex){ ex.printStackTrace(); } return pro; }}
运行结果一样。
Spring方法来实现工厂模式:
- 增加pro.properties
class=simplefactory.Product
- 修改simpleFactory.java
import java.io.IOException;import java.io.InputStream;import java.util.Properties;public class SimpleFactory { public Product createProduct(String type){ Product pro=null; try{ Properties p = new Properties(); InputStream in = null; try {//获取属性 in = SimpleFactory2.class.getResourceAsStream("pro.properties"); p.load(in); } catch (IOException e) { e.printStackTrace(); }finally{ try { in.close(); } catch (IOException e) { e.printStackTrace(); } } pro = (Product)Class.forName(p.getProperty("class")).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return pro; }}
运行结果和前面一致。
0 0
- 设计模式——简单工厂模式
- 设计模式——简单工厂模式
- 设计模式——简单工厂模式
- 设计模式——简单工厂模式
- 设计模式——简单工厂模式
- 【设计模式】——简单工厂模式
- 设计模式——简单工厂模式
- 设计模式——简单工厂模式
- 设计模式——简单工厂模式
- 设计模式——简单工厂模式
- 设计模式——简单工厂模式
- 设计模式——简单工厂模式
- 设计模式——简单工厂模式
- 设计模式——简单工厂模式
- 设计模式——简单工厂模式
- 设计模式——简单工厂模式
- 【设计模式】——简单工厂模式
- 设计模式——简单工厂模式
- 算法系列(七)数据结构之树的基本结构和二叉树的遍历
- 数据结构—非连通图的遍历
- 2016年湘潭地区邀请赛总结
- 手机开发实战82——HTML介绍1
- ARM中的常用指令
- 设计模式——简单工厂模式
- C#之四十五 扑克牌Memorize
- 使用Maven自动部署插件
- 手机开发实战83——HTML介绍2
- poj 1521 Entropy
- 畅通工程——kruskal+并查集
- 196. Delete Duplicate Emails
- 手机开发实战84——HTML介绍3
- LeetCode Rotate Array