基本概念
简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例,它是工厂模式家族中最简单实用的模式。简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
结构图
上图摘自http://www.tutorialspoint.com/design_pattern
应用场景
当需要工厂类负责创建的对象比较少,并且客户端只关心传入工厂类的参数,对于创建对象的逻辑并不关心的时候,可以使用简单工厂模式。
源码示例
1.创建一个Shape接口
package com.spook.simplefactory; /** * Shape接口 */ public interface Shape { public void draw(); }2.创建Circle类
package com.spook.simplefactory; /** * Circle类 */ public class Circle implements Shape { @Override public void draw() { // TODO Auto-generated method stub System.out.println("draw Circle"); } }3.创建Rectangle类
package com.spook.simplefactory; /** * Rectangle类 */ public class Rectangle implements Shape { @Override public void draw() { // TODO Auto-generated method stub System.out.println("draw Rectangle"); } }4.创建Square类
package com.spook.simplefactory; /** * Square类 */ public class Square implements Shape { @Override public void draw() { // TODO Auto-generated method stub System.out.println("draw Square"); } }5.创建枚举类ShapeType
package com.spook.simplefactory; /** * Shape类型枚举 */ public enum ShapeType { CIRCLE, RECTANGLE, SQUARE; }6.创建工厂类
package com.spook.simplefactory; /** * 图形工厂类 */ public class ShapeFactory { public Shape getShape(ShapeType type) { switch (type) { case CIRCLE: return new Circle(); case RECTANGLE: return new Rectangle(); case SQUARE: return new Square(); default: return null; } } }7.测试类
package com.spook.simplefactory; /** * 测试类 */ public class Test { public static void main(String[] args) { // TODO Auto-generated method stub ShapeFactory shapeFactory = new ShapeFactory(); Shape circle = shapeFactory.getShape(ShapeType.CIRCLE); circle.draw(); Shape rectangle = shapeFactory.getShape(ShapeType.RECTANGLE); rectangle.draw(); Shape square = shapeFactory.getShape(ShapeType.SQUARE); square.draw(); } }运行测试类输出如下内容:
draw Circle draw Rectangle draw Square
备注
简单工厂其实是违反了开放-封闭原则的,比如上面的例子,需要增加一个Triangle类,那么工厂类也得做对应修改,因此一般该模式只在很简单的情况下应用。也正为简单工厂模式的缺陷,才会有工厂方法等其他模式。