工厂模式说明

目录

1.引入

2.定义

3.分类

1.简答工厂模式

2.工厂方法模式

3.抽象工厂模式

4.总结


1.引入

观察下面这个代码,主要内容是创建一个线程池,池子里现成数目固定为10个。

java 复制代码
    public static void main(String[] args) {
        //创建一个线程池,池子里现成数目固定为10个
        ExecutorService pool = Executors.newFixedThreadPool(10);
        
        for (int i = 0; i < 1000; i++) {
            int n = i;
            pool.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println("hello" + n);
                }
            });
        }
    }

ExecutorService pool = Executors.newFixedThreadPool(10);

使用newFixedThreadPool()方法创建了一个固定大小的线程池。这里的new是方法名的一部分,而不是关键字new。通过调用某个类的静态方法来直接构造出一个对象(相当于将new操作隐藏在方法后面),这样的方法被称为"工厂方法"。提供这个工厂方法的类被称为"工厂类"。在这个例子中,我们使用了"工厂模式"这种设计模式。

2.定义

工厂模式是一种创建型设计模式,它将对象的创建和使用分离,使得客户端代码在创建对象时不需要知道其具体的实现细节

工厂模式:一句话表示,使用普通方法,来代替构造方法,创建对象。

为什么需要代替构造方法?因为构造方法存在一些限制,它只能用于创建一种特定类型的对象。如果要创建多种不同情况的对象,使用构造方法会变得困难。

例如,我们现在要建立一个类来表示平面上的一个点,可能需要用不同的坐标系(如笛卡尔坐标系和极坐标系)来表示这个点。如果我们只使用构造方法,就需要为每种坐标系创建一个单独的构造函数,这样会导致代码冗余和难以维护。

java 复制代码
class Point{
    //使用笛卡尔坐标系,构造点
    public Point(double x, double y){}
    //使用极坐标系,构造点
    public Point(double r, double a){}
}

为了解决这个问题,我们可以使用工厂模式来代替构造方法。

java 复制代码
class PointFactory{
    //使用笛卡尔坐标系,构造点
    public static Point makePointByXY(double x, double y){}
    //使用极坐标系,构造点
    public static Point makePointByRA(double r, double a){}
}

3.分类

1.简答工厂模式

  • 定义 :简单工厂模式(Simple Factory Pattern)不是一种正式的设计模式,但它是其他工厂模式的基础。它由一个工厂类根据传入的参数决定创建哪一种产品类的实例。
  • 例子 :假设有一个ShapeFactory,它根据传入的参数来创建不同的形状对象。如果传入"circle",则返回一个Circle对象;如果传入"rectangle",则返回Rectangle对象。
java 复制代码
public class ShapeFactory {
    public Shape getShape(String shapeType) {
        if (shapeType.equalsIgnoreCase("circle")) {
            return new Circle();
        } else if (shapeType.equalsIgnoreCase("rectangle")) {
            return new Rectangle();
        }
        return null;
    }
}

2.工厂方法模式

  • 定义:工厂方法模式(Factory Method Pattern)定义了一个创建对象的接口,但将实际的对象创建工作推迟到子类。这样,当需要增加新的产品时,只需扩展一个新的工厂子类。
  • 例子 :在创建一个Shape对象的例子中,定义一个ShapeFactory接口及其具体实现CircleFactoryRectangleFactory。客户端代码仅依赖于ShapeFactory接口,而不是具体的工厂实现。
java 复制代码
public interface ShapeFactory {
    Shape getShape();
}
public class CircleFactory implements ShapeFactory {
    public Shape getShape() {
        return new Circle();
    }
}
public class RectangleFactory implements ShapeFactory {
    public Shape getShape() {
        return new Rectangle();
    }
}

3.抽象工厂模式

  • 定义:抽象工厂模式(Abstract Factory Pattern)提供一个创建一系列相关或依赖对象的接口,而无需指定它们的具体类。这种模式适用于系统中有多个产品族,每个具体工厂创建同一族但不同等级结构的产品。
  • 例子 :假设有两个产品族,一个是Shape,另一个是ColorAbstractFactory定义了创建这些对象的方法,并由ShapeAndColorFactory实现。
java 复制代码
public interface AbstractFactory {
    Shape createShape();
    Color createColor();
}
public class ShapeAndColorFactory implements AbstractFactory {
    public Shape createShape() {
        return new Circle();
    }
    public Color createColor() {
        return new Red();
    }
}

4.总结

工厂模式的优点在于它可以使代码更加模块化,提高代码的复用性和扩展性。同时,它减少了调用者因创建逻辑导致的错误。缺点是每次增加新产品都需要增加具体类和工厂,可能导致系统中类的个数成倍增加,从而增加系统复杂度。

总之,工厂模式在许多实际应用中非常有用,例如日志记录器位置的选择、数据库访问框架设计等场景。在这些情况下,使用工厂模式可以有效管理和隔离对象的创建过程,使客户端代码更加简洁和易于维护。

相关推荐
夏天拐跑了西瓜10 小时前
Spring Cloud 微服务实战(三):一个服务挂了,凭什么拖垮整个系统?Sentinel 限流熔断实战
java·spring cloud·微服务
CRMEB定制开发10 小时前
2026年最值得推荐的10大开源商城系统盘点
开发语言·人工智能·开源·商城系统·小程序商城
2601_9672642810 小时前
Jetpack Compose 实践指南:从入门到进阶
java·学习
buhuizhiyuci10 小时前
【QT-百日筑基篇】修真世界摸爬滚打多年,终于黄天不负有心人,突破炼器中期——常用控件QWight的属性
开发语言·c++·qt·gui·图形化
m0_5873830011 小时前
社区家政系统开发实战:从需求分析到上线部署全指南
java·spring boot·spring·需求分析
凤山老林11 小时前
动态 i18n 体系落地:Spring Boot 多租户热加载与前后端协同实践
java·spring boot·后端·i18n
白露与泡影11 小时前
解密 Pi 的 Harness 工程:Agent 会话如何实现持久化与恢复
java·人工智能·算法
Littlehero_12112 小时前
QT自定义控件之热换站系统(源码开源)
开发语言·qt
meilindehuzi_a12 小时前
Python 基础语法(1):常量、变量、类型、输入输出与运算符
开发语言·python
caimouse12 小时前
ReactOS 窗口系统分析(5):可见区域与窗口 DC — vis.c + windc.c
c语言·开发语言