设计模式(5):简单工厂模式

简单工厂模式

简单工厂模式并不属于GoF归纳的23个经典的设计模式,更像是工厂方法模式(Factory Method Pattern)的一种变体。简单工厂模式又称为静态工厂方法(Static Factory Method)模式,也用于对象的创建。

使用场景

上一节介绍了工厂方法模式,但是有时候并不需要那么多工厂生产,可能只需要一个工厂类就足够了,这个时候我们可以修改一下工厂方法模式中的结构,去掉抽象工厂类,只要一个具体的工厂,并将工厂中的生产方法设置成静态类型的,就可以满足我们新的需求。

简单工厂模式实现(Implement)

结构

按照上面所说,对工厂方法模式的结构进行修改,结构如下
ShowImage

  • Shape

    – Product的抽象类

  • Circle或者Square等等

    – ConcreteProduct的具体类

  • ShapeFactory

    – 去掉抽象的工厂类,只有这一个工厂

    – 提供静态的CreateShape方法进行生产Product

代码

Shape类还是跟上一节一样

1
2
3
4
5
6
7
8
9
public abstract class Shape {
public String name;
public Shape(String name) {
this.name = name;
}
public abstract void draw();
}

Circle类

1
2
3
4
5
6
7
8
9
10
public class Circle extends Shape {
@Override
public void draw() {
System.out.println("Draw a circle..." + name);
}
public Circle(String name) {
super(name);
}
}

Square类

1
2
3
4
5
6
7
8
9
10
public class Square extends Shape {
@Override
public void draw() {
System.out.println("Draw a square..." + name);
}
public Square(String name) {
super(name);
}
}

简单工厂类

1
2
3
4
5
6
7
8
9
10
11
12
public class SimpleFactory {
public static Shape createShape(String type, String name) {
if (type.equalsIgnoreCase("circle")) {
return new Circle(name);
} else if (type.equalsIgnoreCase("square")) {
return new Square(name);
} else {
System.out.println("无法生产这种类型的产品");
return null;
}
}
}

调用简单工厂

1
2
3
4
5
6
7
8
9
10
11
12
13
public class SimpleFactoryTest {
@Test
public void simpleFactoryTest() {
Shape square1 = SimpleFactory.createShape("Square", "square1");
Shape square2 = SimpleFactory.createShape("square", "square2");
Shape circle1 = SimpleFactory.createShape("circle", "circle1");
Shape circle2 = SimpleFactory.createShape("Circle", "circle2");
square1.draw();
circle1.draw();
square2.draw();
circle2.draw();
}
}

总结

简单工厂模式并不是23种设计模式中的一种,但是还是有它的应用场景。

简单工厂模式的优点

  • 客户端(调用者)没有直接去创建产品对象,还是将生产对象的工作交给工厂来完成,客户端只是来”消费”产品。
  • 相比较工厂方法,更加简单,适用于某些场景。

简单工厂模式的缺点

  • 简单工厂集中了所有产品的创建逻辑,一旦不能正常工作,整个系统都会受到影响。
  • 扩展比较麻烦,如果增加新产品就得去修改工厂的逻辑,而在产品越来越多的情况下,工厂的逻辑就会显得十分复杂,而工厂方法模式通过继承抽象工厂的方式来增加产品,具有更加良好的扩展性。

参考代码

------ 本文结束 ------

版权声明


BillyYccc's blog by Billy Yuan is licensed under a Creative Commons BY-NC-SA 4.0 International License.
本文原创于BillyYccc's Blog,转载请注明原作者及出处!