基本概念
简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例,它是工厂模式家族中最简单实用的模式。简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
结构图
上图摘自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类,那么工厂类也得做对应修改,因此一般该模式只在很简单的情况下应用。也正为简单工厂模式的缺陷,才会有工厂方法等其他模式。