- 大家好!欢迎莅临厚土燎原的天地,深感荣幸能与您相遇在此,共同品读我的拙作。您的阅读如同春风化雨,对我而言意义非凡。衷心邀请您留下宝贵的评论与指点,每一字一句都是对我莫大的鼓励与鞭策。热烈欢迎,期待与您智慧碰撞,共绘思想的火花!
- 🌿🌿🌿 个人主页:厚土燎原
目录
描述
工厂方法模式(Factory Method Pattern)是面向对象设计中创建型模式的一种。它的主要目的是定义一个用于创建对象的接口,但让子类决定要实例化的类是哪一个。工厂方法让类的实例化推迟到子类中进行。在工厂方法模式中,创建对象的责任被划分成了两部分:一部分是定义创建对象的接口(也就是抽象工厂类),另一部分是具体实现接口的类(也就是具体工厂类)。
本质:不再提供统一个工厂类,而是每一个产品对应一个工厂,工厂都实现同一个接口。
角色
抽象工厂:提供创建产品的接口
具体工厂:实现创建产品的接口,完成产品的创建。
抽象产品:产品的公共接口。
具体产品:工厂创建的目标。
优点
1、扩展性好:当需要增加新的产品时,只需要增加一个具体的产品类和对应的具体工厂类,无需修改抽象工厂 和抽象产品代码。
2、符合开闭原则:对扩展开放,对修改关闭,增加了系统的稳定性和可维护性。
3、隐藏了产品类的创建细节:客户端只需要关心产品的接口,不需要知道产品是如何被创建出来的。
缺点
1、增加了类的数量:每增加一个产品,就需要增加一个具体产品类和一个具体工厂类,增加了系统的复杂度。
2、系统层次结构较多:增加了系统的抽象性和理解难度。
适用场景
当一个类不知道它所必须创建的对象的类时:在工厂方法模式中,客户端不需要知道具体产品的类名,只需要知道对应的工厂类即可。
当一个类希望由它的子类来指定它所创建的对象时:工厂方法模式允许子类在实例化时改变所创建对象的类型。
当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化时:通过工厂方法,可以将对象的创建逻辑封装在工厂类中,客户端不需要关心对象的创建过程。
总结
简述:不同条件下创建不同实例
一句话概括:产品标准化,生产更高效
目的:封装创建细节
生活案例:实体工厂
实例
抽象工厂
public interface ShapeFactory {
Shape getShape();
}
具体工厂
public class CircleShapeFactory implements ShapeFactory{
@Override
public Shape getShape() {
return new CircleShape();
}
}
public class RectShapeFactory implements ShapeFactory{
@Override
public Shape getShape() {
return new RectShape();
}
}
public class TriangleShapeFactory implements ShapeFactory{
@Override
public Shape getShape() {
return new TriangleShape();
}
}
抽象产品
public interface Shape {
void draw();
}
具体产品
public class CircleShape implements Shape{
@Override
public void draw() {
System.out.println("draw circleShape");
}
}
public class RectShape implements Shape{
@Override
public void draw() {
System.out.println("draw rectShape");
}
}
public class TriangleShape implements Shape{
@Override
public void draw() {
System.out.println("draw triangleShape");
}
}
具体使用
public static void main(String[] args) {
ShapeFactory triangleShapeFactory = new TriangleShapeFactory();
ShapeFactory rectShapeFactory = new RectShapeFactory();
ShapeFactory circleShapeFactory = new CircleShapeFactory();
Shape triangleShape = triangleShapeFactory.getShape();
Shape rectShape = rectShapeFactory.getShape();
Shape circleShape = circleShapeFactory.getShape();
triangleShape.draw();
rectShape.draw();
circleShape.draw();
}