简单工厂模式不属于Gof的23种设计模式之一,但是普遍适用于编程中,所以都会把简单工厂模式归为设计模式之一.并且作为学习工厂模式的入门模式.
示例场景:
有一个图形绘制功能,需要绘制或者擦除各种图形,例如圆形、三角形、矩形等,而且可以较为方便地对图形库进行扩展,以便能够在将来增加一些新类型的图表。
UML类图
UML类图代码示例:
图形接口
public interface Shape {
void draw();
void erase();
}
三角形
public class Triangle implements Shape {
public Triangle() {
System.out.println("创建绘制三角形工具");
}
@Override
public void draw() {
System.out.println("绘制三角形");
}
@Override
public void erase() {
System.out.println("擦除三角形");
}
}
图形工厂
public class ShapeFactory {
public static Shape getShape(String type) {
Shape shape =null;
if(type.equalsIgnoreCase("round")){
shape = new Round();
}else if(type.equalsIgnoreCase("rectangle")){
shape = new Rectangle();
}else if(type.equalsIgnoreCase("triangle")){
shape = new Triangle();
}
return shape;
}
}
调用
代码中使用了读取XML的配置,这样就能够在不修改代码的基础上改变绘制的图形
public static void main(String[] args){
Shape shape ;
shape = ShapeFactory.getShape(SimpleFactoryXmlUtil.getShapeType());
shape.draw();
shape.erase();
}
小结:
简单工厂作为设计模式是违反了面向对象设计原则中的开闭原则,需要对系统进行拓展的时候就需要修改源代码,但是这种现象在编程中会普遍存在,所以要考虑使用的场景.
简单工厂的优点:
- 1.简单工厂模式实现了对象创建和使用的分离
- 2.调用者无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数
- 3.通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。
缺点:
- 1.由于工厂类集中了所有产品的创建逻辑,职责过重,一旦不能正常工作,整个系统都要受到影响
- 2.扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护
适用场景:
示例中用创建图形作为简单工厂的示例并不合适,因为可能会出现多种图形,并且对以后的拓展并不友好
- 1.工厂类负责创建的对象比较少,由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂
- 2.调用者只想知道调用参数,不关心对象创建
网友评论