简单工厂模式

简单工厂模式其实并不算是一种设计模式,更多的时候是一种编程习惯。

定义:
  定义一个工厂类,根据传入的参数不同返回不同的实例,被创建的实例具有共同的父类或接口。

适用场景:
  其实由定义也大概能推测出其使用场景,首先由于只有一个工厂类,所以工厂类中创建的对象不能太多,否则工厂类的业务逻辑就太复杂了,其次由于工厂类封装了对象的创建过程,所以客户端应该不关心对象的创建。总结一下适用场景:

:::info (1)需要创建的对象较少。
(2)客户端不关心对象的创建过程。 :::   

以上就是简单工厂模式简单工厂模式的适用场景,下面看一个具体的实例。
image.png 具体的实现代码:

这里定义成抽象类也是可以的,只不过接口是更高一级的抽象,所以习惯定义成接口,而且接口支持多实现,方便以后扩展。

  1. public interface Shape {
  2. void draw();
  3. }

下面就是编写具体的图形,每种图形都实现Shape 接口

  1. public class CircleShape implements Shape {
  2. public CircleShape() {
  3. System.out.println( "CircleShape: created");
  4. }
  5. @Override
  6. public void draw() {
  7. System.out.println( "draw: CircleShape");
  8. }
  9. }

正方形

  1. public class RectShape implements Shape {
  2. public RectShape() {
  3. System.out.println( "RectShape: created");
  4. }
  5. @Override
  6. public void draw() {
  7. System.out.println( "draw: RectShape");
  8. }
  9. }

三角形

  1. public class TriangleShape implements Shape {
  2. public TriangleShape() {
  3. System.out.println( "TriangleShape: created");
  4. }
  5. @Override
  6. public void draw() {
  7. System.out.println( "draw: TriangleShape");
  8. }
  9. }

下面是工厂类的具体实现

  1. public class ShapeFactory {
  2. public static final String TAG = "ShapeFactory";
  3. public static Shape getShape(String type) {
  4. Shape shape = null;
  5. if (type.equalsIgnoreCase("circle")) {
  6. shape = new CircleShape();
  7. } else if (type.equalsIgnoreCase("rect")) {
  8. shape = new RectShape();
  9. } else if (type.equalsIgnoreCase("triangle")) {
  10. shape = new TriangleShape();
  11. }
  12. return shape;
  13. }
  14. }

在这个工厂类中通过传入不同的type可以new不同的形状,返回结果为Shape 类型,这个就是简单工厂核心的地方了。

客户端使用:

画圆形

  1. Shape shape= ShapeFactory.getShape("circle");
  2. shape.draw();

工厂方法模式

工厂方法模式是简单工厂的仅一步深化, 在工厂方法模式中,我们不再提供一个统一的工厂类来创建所有的对象,而是针对不同的对象提供不同的工厂。也就是说每个对象都有一个与之对应的工厂。
image.png

参考

https://juejin.im/entry/58f5e080b123db2fa2b3c4c6 https://segmentfault.com/a/1190000013053013(python实现)