工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
主要解决:主要解决接口选择的问题。
何时使用:我们明确地计划不同条件下创建不同实例时。
如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。
缺点:每增加一种类型,就需要修改工厂类的判断
使用反射机制可以解决每次增加一个产品时,都需要增加一个对象实现工厂的缺点
public class ShapeFactory {
public static <T> T getClass(Class<? extends T> clazz) {
T obj = null;
try {
obj = (T) Class.forName(clazz.getName()).newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return obj;
}
}
Rectangle rect = ShapeFactory.getClass(Rectangle.class);
rect.draw();
Shape square = ShapeFactory.getClass(Square.class);
square.draw();
使用枚举类优化
public enum Factory {
CIRCLE(new Circle(),"CIRCLE"),
RECTANGLE(new Rectangle(),"RECTANGLE"),
SQUARE(new Square(),"SQUARE");
// 成员变量
private Shape shape;
private String name;
// 普通方法
public static Shape getShape(String name) {
for (Factory c : Factory.values()) {
if (c.name == name) {
return c.shape;
}
}
return null;
}
// 构造方法
private Factory(Shape shape, String name) {
this.shape = shape;
this.name = name;
}
public String getName() {
return name;
}
public Shape getShape() {
return shape;
}
public void setShape(Shape shape) {
this.shape = shape;
}
public void setName(String name) {
this.name = name;
}
}
Factory.getShape("CIRCLE").draw();
Factory.getShape("RECTANGLE").draw();
Factory.getShape("SQUARE").draw();
一、一句话概括工厂模式
- 简单工厂:一个工厂类,一个产品抽象类。
- 工厂方法:多个工厂类,一个产品抽象类。
- 抽象工厂:多个工厂类,多个产品抽象类。
二、生活中的工厂模式
- 简单工厂类:一个麦当劳店,可以生产多种汉堡。
- 工厂方法类:一个麦当劳店,可以生产多种汉堡。一个肯德基店,也可以生产多种汉堡。
- 抽象工厂类:百胜餐饮集团下有肯德基和百事公司,肯德基生产汉堡,百事公司生成百事可乐。
参考:https://www.runoob.com/design-pattern/factory-pattern.html