本质

不使用new创建对象,而是用工厂。

工厂类图示例

图片说明
有一个工厂,在工厂内部来new对象。因此我们在main中只需要传参给工厂类即可。
更具体一点:
图片说明

代码如下

接口

public interface Shape {
    void draw();
}

三个类

public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("画圈圈");
    }
}
public class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("画正方形.");
    }
}
public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("画长方形");
    }
}

工厂类(可以看到,工厂根据传过来的参数进行对应的new对象)

public class Factory {
    //使用 getShape 方法获取形状类型的对象
    public Shape getShape(String shape){
        if(shape == null){
            return null;
        }
        if(shape.equals("圆")){
            return new Circle();
        } else if(shape.equals("长方形")){
            return new Rectangle();
        } else if(shape.equals("正方形")){
            return new Square();
        }
        return null;
    }
}

main方法,此时我想要调用相关对象的draw方法。

public class Main {
    public static void main(String[] args){
        //
        Factory factory = new Factory();
        Shape  shape1= factory.getShape("圆");
        shape1.draw();
        Shape  shape2= factory.getShape("长方形");
        shape2.draw();
        Shape  shape3= factory.getShape("正方形");
        shape3.draw();
    }
}

运行结果:

画圈圈
画长方形
画正方形.

小结

优点:

  1. 一个调用者想创建一个对象,只要知道其名称就可以了。上面的我输入的是圆就可以建对象,而不是类名Circle
  2. 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
  3. 屏蔽产品的具体实现,调用者只关心产品的接口。

个人理解:看其他博客,好像我的示例是简单工厂,但工厂模式与简单工厂特别相似。简单工厂是一个工厂什么都造,而工厂模式比较专一,比如本例,如果用三个工厂,分别对应3个不同的Shape,那么就形成了工厂模式。可以理解成一个工厂对应一类产品,多个工厂就共同构成了工厂模式,这样是一个解耦的过程。