java设计模式---工厂模式

本文介绍工厂模式的概念及其在Java中的应用实例。通过组装电脑的过程展示如何使用工厂模式来创建复杂的对象,而不暴露创建逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java设计模式—工厂模式

何为工厂模式

顾名思义,工厂是生产产品的地方,我们需要什么产品就去什么工厂中拿就行了,而不需要关心它是如何制作的。对于我们面向对象的编程来说,当需要某一个对象的时候,运用工厂设计模式,我们可以不去关心该对象的复杂创建过程,创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。

应用实例

比如说:我们需要组装一台电脑,我们只需要将自己选择的cup型号和主板型号告诉组装电脑的工程师即可,我们不需要关系整个的生产以及组装过程。

框架设计

这里写图片描述

分析:client客户、ComputerEngineer电脑工程师,主要方法是makeComputer组装电脑,以及prepareHardwares准备硬件、CpuFactory负责生产各种型号的cup、MainboardFactory负责生产各种型号的主板,IntelCpu和AmdCpu都是Cpu的具体实现。IntelMainboard和AmdMainboard都是Mainboard的具体实现。

代码

按照上面的框架设计,从下往上进行代码的编写。

1.首先定义接口

Cpu接口

/**
 * @author LiHaiNan
 * @version V1.0
 * @Description: Cpu接口
 * @date 下午 9:25 2017/9/20 0020
 */
public interface Cpu {
    /**
    * @Title: calculate
    * @Description: 计算数据
    * @Date:下午 9:26 2017/9/20 0020
    * @author LiHaiNan
    * @param: void
    * @return: void
    */
     void calculate();
}

Mainboard接口

/**
 * @author LiHaiNan
 * @version V1.0
 * @Description: Mainboard接口
 * @date 下午 9:27 2017/9/20 0020
 */
public interface Mainboard {
    /**
    * @Title: installCpu
    * @Description: 安装cup的板子
    * @Date:下午 9:27 2017/9/20 0020
    * @author LiHaiNan
    * @param: void
    * @return: void
    */
    void installCpu();
}
2.编写两个接口的具体实现
/**
 * @author LiHaiNan
 * @version V1.0
 * @Description: AmdCpu
 * @date 下午 9:31 2017/9/20 0020
 */
public class AmdCpu implements Cpu {
    //针脚数
    private int pins=500;

    @Override
    public void calculate() {
        System.out.println("AmdCpu-pins{}"+pins);
    }
}
/**
 * @author LiHaiNan
 * @version V1.0
 * @Description: IntelCpu
 * @date 下午 9:31 2017/9/20 0020
 */
public class IntelCpu implements Cpu {
    //针脚数
    private int pins=600;

    @Override
    public void calculate() {
        System.out.println("IntelCpu-pins{}"+pins);
    }
}
/**
 * @author LiHaiNan
 * @version V1.0
 * @Description: AmdMainboard
 * @date 下午 9:31 2017/9/20 0020
 */
public class AmdMainboard implements Mainboard{
    //cup插槽孔数
    private int cpuHoles=500;

    @Override
    public void installCpu() {
        System.out.println("AmdMainboard-cpuHoles{}"+cpuHoles);
    }
/**
 * @author LiHaiNan
 * @version V1.0
 * @Description: IntelMainboard
 * @date 下午 9:31 2017/9/20 0020
 */
public class IntelMainboard  implements Mainboard{
    //cup插槽孔数
    private int cpuHoles=600;

    @Override
    public void installCpu() {
        System.out.println("IntelMainboard-cpuHoles{}"+cpuHoles);
    }
}
3.生产cpu与mainboard的工厂
/**
 * @author LiHaiNan
 * @version V1.0
 * @Description: CpuFactory
 * @date 下午 9:43 2017/9/20 0020
 */
public class CpuFactory {
    /**
     * @Title: createCpu
     * @Description: 创建cpu的工厂
     * @Date:下午 9:47 2017/9/20 0020
     * @author LiHaiNan
     * @param: String type
     * @return: Cpu
     */
    public Cpu createCpu(String type){
        Cpu cpu=null;
        if ("Intel".equals(type)){
            cpu=new IntelCpu();
        }else if ("Amd".equals(type)){
            cpu=new AmdCpu();
        }
        return cpu;
    }
}
/**
 * @author LiHaiNan
 * @version V1.0
 * @Description: MainboardFactory
 * @date 下午 9:43 2017/9/20 0020
 */
public class MainboardFactory {
    /**
    * @Title: createCpu
    * @Description: 创建主板的工厂
    * @Date:下午 9:47 2017/9/20 0020
    * @author LiHaiNan
    * @param: String type
    * @return: Mainboard
    */
    public Mainboard createMainboard(String type){
        Mainboard mainboard=null;
        if ("Intel".equals(type)){
            mainboard=new IntelMainboard();
        }else if ("Amd".equals(type)){
            mainboard=new AmdMainboard();
        }
        return mainboard;
    }
}
4.电脑工程师
/**
 * @author LiHaiNan
 * @version V1.0
 * @Description: ComputerEngineer
 * @date 下午 9:52 2017/9/20 0020
 */
public class ComputerEngineer {
    //组装机器所用的产品
    private Cpu cpu=null;
    private Mainboard mainboard=null;
    //生产产品所用的工厂
    CpuFactory cpuFactory=new CpuFactory();
    MainboardFactory mainboardFactory=new MainboardFactory();

    public void makeComputer(String cpuType,String mainboardType){
        //找到工厂获取
        cpu=cpuFactory.createCpu(cpuType);
        mainboard=mainboardFactory.createMainboard(mainboardType);
        //测试产品是否可用
        cpu.calculate();
        mainboard.installCpu();
    }
}
5.客户调用
/**
 * @author LiHaiNan
 * @version V1.0
 * @Description: 客户调用
 * @date 下午 10:01 2017/9/20 0020
 */
public class Main {

    public static void main(String[] args){
        ComputerEngineer computerEngineer=new ComputerEngineer();
        computerEngineer.makeComputer("Intel","Intel");
    }
}
### Java 工厂设计模式原理与实现 #### 定义与分类 工厂模式属于创建型设计模式,在Java编程中用于封装对象的创建逻辑。这种模式提供了接口以创建对象,而无需指定确切的类名[^1]。 存在三种主要类型的工厂模式- **简单工厂模式**:不作为标准的设计模式被提及,但常用来简化对象实例化的过程。 - **工厂方法模式**:定义了一个创建对象的接口,让子类决定实例化哪一个类。 - **抽象工厂模式**:提供了一组相关或相互依赖的对象的创建方式,通常返回一族类[^3]。 #### 实现机制 在工厂模式下,客户端不再直接使用`new`关键字来创建对象,而是调用特定的方法获取所需对象。这使得程序可以在不影响现有代码的基础上引入新的产品类型[^2]。 对于每一种工厂模式而言,其实现的核心在于如何解耦合对象使用者和具体的产品类之间的关系,从而提高系统的灵活性和可维护性[^4]。 #### 示例代码 以下是基于上述提到的不同种类工厂模式的一个简单例子说明: ##### 简单工厂模式 ```java // 定义操作基类 abstract class Operation { protected double numberA; protected double numberB; abstract double getResult(); } class Add extends Operation { @Override double getResult() { return this.numberA + this.numberB; } } // 创建一个静态工厂类来进行运算符的选择 public class OperationFactory { public static Operation createOperation(String operate){ Operation oper = null; switch(operate){ case "+": oper = new Add(); // 可能还有其他的操作如减乘除等... break; default: throw new IllegalArgumentException("Unsupported operation"); } return oper; } } ``` ##### 使用示例 ```java double numA = 10.0d, numB = 5.0d; String op = "+"; Operation oper = OperationFactory.createOperation(op); oper.setNumberA(numA); oper.setNumberB(numB); System.out.println("Result:" + oper.getResult()); ``` 此段代码展示了通过传入不同的字符串参数(这里是加号),可以动态地获得相应类型的`Operation`对象并执行计算功能,而不必关心内部的具体实现细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值