本质
不使用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(); } }
运行结果:
画圈圈 画长方形 画正方形.
小结
优点:
- 一个调用者想创建一个对象,只要知道其名称就可以了。上面的我输入的是圆就可以建对象,而不是类名Circle
- 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
- 屏蔽产品的具体实现,调用者只关心产品的接口。
个人理解:看其他博客,好像我的示例是简单工厂,但工厂模式与简单工厂特别相似。简单工厂是一个工厂什么都造,而工厂模式比较专一,比如本例,如果用三个工厂,分别对应3个不同的Shape,那么就形成了工厂模式。可以理解成一个工厂对应一类产品,多个工厂就共同构成了工厂模式,这样是一个解耦的过程。