这才是真正的工厂模式,前面的简单工厂模式就是演示一下:一个调用者想创建一个对象,只要知道其名称就可以了,至于里面的逻辑就不需要知道,只需要知道这个名称能获得什么类型的对象就可以
它还有两个优点:
1、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以
2、屏蔽产品的具体实现,调用者只关心产品的接口
先来看一个示例图
看到这可能有一些模糊,你先看最大的按个方框,它是不是包裹起来个4个部分,这个就是工厂类需要干的事,而最右边那两个就是外部调用者调用的工厂类的方式,只需要调用ShapeFactory的getShape 方法就可以获得一个Shape对象,至于获得的逻辑就不需要我们操心了,交给工厂类去做。
示例图的实现
工厂类内部的逻辑类(我们是不用管的)
public interface Shape {
void draw();
}
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
工厂类
public class ShapeFactory {
//使用 getShape 方法获取形状类型的对象
public Shape getShape(String shapeType){
if(shapeType == null){
return null;
}
if(shapeType.equalsIgnoreCase("CIRCLE")){
return new Circle();
} else if(shapeType.equalsIgnoreCase("RECTANGLE")){
return new Rectangle();
} else if(shapeType.equalsIgnoreCase("SQUARE")){
return new Square();
}
return null;
}
}
外部执行者怎么调用工厂类
public class FactoryPatternDemo {
public static void main(String[] args) {
ShapeFactory shapeFactory = new ShapeFactory();
//获取 Circle 的对象,并调用它的 draw 方法
Shape shape1 = shapeFactory.getShape("CIRCLE");
//调用 Circle 的 draw 方法
shape1.draw();
//获取 Rectangle 的对象,并调用它的 draw 方法
Shape shape2 = shapeFactory.getShape("RECTANGLE");
//调用 Rectangle 的 draw 方法
shape2.draw();
//获取 Square 的对象,并调用它的 draw 方法
Shape shape3 = shapeFactory.getShape("SQUARE");
//调用 Square 的 draw 方法
shape3.draw();
}
}
结果
Inside Circle::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.
注意:当然上面的这些都可以,不过我还是觉的应该把构造函数私有化,这样外人就不能new出来需要的对象,只能去工厂类调用返回的方法,上面只是把Shape接口的所有实现类放在了工厂里,没办法阻止调用者直接new Shape接口的某一个实现类
关于怎么私有化构造方法并且只能在工厂模式实例化对象的方式请参考我的另一篇博客简单的工厂模式(也不算工厂模式,就是不让你new,只能通过我的工厂类来new)
参考菜鸟教程https://www.runoob.com/design-pattern/factory-pattern.html
————————————————
版权声明:本文为CSDN博主「胖墩的IT」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43113679/article/details/99301915