简单工厂模式
2015-09-10 10:03
281 查看
简单工厂模式
不要为了套模式而使用模式。我们的目的是易维护,易扩展。核心
工厂类,这个类含有判断逻辑,决定生成用户需要的子类,并生成相应对象实例返回给用户使用。好处
简单工厂模式的好处是可以将产品对象的细节封装在其实现类的内部,改变一个产品对象具体实现不会影响其他产品。可扩展性强,当需要新增产品类型时,只需要添加对应的实现类,然后修改工厂,增加一个判断分支即可。修改工厂函数带来的风险比较低,我们保留了对子类随时删减的权利 ,使用者不需要了解我们有什么子类。而客户端则可以免除直接创建产品对象的责任,而仅仅负责‘消费’产品。简单工厂模式通过这种做法实现了对责任的分割。坏处
当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;只适用于简单的业务情况。这样全部的判断集中在工厂类中也不好维护。例子
定义接口–抽象产品
public interface Shape { void draw(); }
创建实现接口的实体类–具体产品类
public class Rectangle implements Shape { @Override public void draw() { System.out.println("Inside Rectangle::draw() method."); } } public class Square implements Shape { @Override public void draw() { System.out.println("Inside Square::draw() method."); } } public class Circle implements Shape { @Override public void draw() { System.out.println("Inside Circle::draw() method."); } }
创建一个工厂类–取决于条件的给予,返回不同的实例。
public class ShapeFactory { //使用 getShape 方法获取形状类型的对象 public Shape getShape(String shapeType){ if(shapeType == null){ return null; } if(shapeType.equalsIgnoreCase("CIRCLE")){ return new Circle(); } else if(shapeType.equalsIgnoreCase("RECTANGLE")){ return new Rectangle(); } else if(shapeType.equalsIgnoreCase("SQUARE")){ return new Square(); } return null; } }
使用工厂,通过传递类型信息来获取实体类的对象。
public class FactoryPatternDemo { public static void main(String[] args) { ShapeFactory shapeFactory = new ShapeFactory(); //获取 Circle 的对象,并调用它的 draw 方法 这里向上转型 Shape shape1 = shapeFactory.getShape("CIRCLE"); //调用 Circle 的 draw 方法 shape1.draw(); //获取 Rectangle 的对象,并调用它的 draw 方法 Shape shape2 = shapeFactory.getShape("RECTANGLE"); //调用 Rectangle 的 draw 方法 shape2.draw(); //获取 Square 的对象,并调用它的 draw 方法 Shape shape3 = shapeFactory.getShape("SQUARE"); //调用 Square 的 draw 方法 shape3.draw(); } }
输出
Inside Circle::draw() method. Inside Rectangle::draw() method. Inside Square::draw() method.
例子来源[]http://www.runoob.com/design-pattern/factory-pattern.html]
相关文章推荐
- Python动态类型的学习---引用的理解
- 土人系列AS入门教程 -- 对象篇
- C#托管堆对象实例包含内容分析
- C#、ASP.NET通用扩展工具类之TypeParse
- Lua编程示例(二):面向对象、metatable对表进行扩展
- Windows Powershell扩展类型系统
- javascript asp教程第十一课--Application 对象
- PowerShell中使用Out-String命令把对象转换成字符串输出的例子
- C#、ASP.NET通用扩展工具类之LogicSugar
- VBS教程:对象-正则表达式(RegExp)对象
- SQL Server下几个危险的扩展存储过程
- C#检查指定对象是否存在于ArrayList集合中的方法
- jQuery 学习第七课 扩展jQuery的功能 插件开发
- 运行Node.js的IIS扩展iisnode安装配置笔记
- sql2008启动代理未将对象应用到实例解决方案
- 一个扩展时间段的dir命令的vbs脚本
- Ruby中使用SWIG编写ruby扩展模块实例
- php中将一个对象保存到Session中的方法
- php对象和数组相互转换的方法
- PHP memcache扩展的三种安装方法