概念:工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式,它提供了一种创建对象的最佳方式。
优劣:
- 优点:调用对象时只需要知道对应对象参数就可以创建;扩展性高;面向接口编程,屏蔽对象的具体实现。
- 缺点:每次增加一个产品,都需要增加一个具体产品类和对应的工厂调用分支,增加了复杂度和具体类的依赖。
使用场景:日志记录器,日志分类、日志记录位置都可以通过工厂模式控制;数据库访问,数据库有可能发生变化时,采用工厂模式控制数据库连接;
何时使用:明确不同条件下创建不同的实例时。
类示意图
示例:
定义图形总接口
package test.Factory1;
/**
* 图形接口
* @author sunlh
*
*/
public interface Shape {
void draw();
}
定义图形实体类,圆形和方形对象
package test.Factory1;
public class CircleShape implements Shape{
@Override
public void draw() {
System.out.println("创建一个圆形图形对象");
}
}
package test.Factory1;
public class SquareShape implements Shape {
@Override
public void draw() {
System.out.println("创建一个方形图形对象");
}
}
定义图形工厂,工厂内有创建不同图形的方法
package test.Factory1;
/**
* 图形工厂
* 定义一个创建图形方法
* @author sunlh
*
*/
public class ShapeFactory {
public Shape getShapes(String shapeType) {
if (shapeType == null) {
return null;
}
if (shapeType.equalsIgnoreCase("circle")) {
return new CircleShape();
} else if (shapeType.equalsIgnoreCase("square")) {
return new SquareShape();
}
return null;
}
}
package test.Factory1;
/**
* 测试
* @author sunlh
*
*/
public class Test {
public static void main(String[] args) {
// 创建图形工厂
ShapeFactory factory = new ShapeFactory();
// 创建圆形图形
Shape circle = factory.getShapes("circle");
circle.draw();
// 创建方形图形
Shape square = factory.getShapes("square");
square.draw();
}
}
测试结果:
创建一个圆形图形对象
创建一个方形图形对象