【每日一记】设计模式——工厂模式

本文详细介绍了工厂模式的概念及其三种类型:简单工厂、工厂方法和抽象工厂。对比了它们各自的特点及适用场景,并给出了相应的代码示例。

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

概述

工厂模式属于创建型模式,是非常常见的设计模式

  • 作用:屏蔽对象创建的细节,降低类之间的耦合

实现

工厂模式可分为简单工厂、工厂方法、抽象工厂

简单工厂

简单工厂由一个工厂类根据传入的参量决定创建出哪一种产品类的实例,虽然降低了客户端对于产品类的依赖,但是所有的逻辑都集中在工厂类中,每当要增加一种新产品时就要修改工厂类的代码,违反了“开闭原则”,扩展性不强。

// 产品
public interface IProduct {
    void use();
}

class ProductA implements IProduct {
    @Override
    public void use() {
        System.out.println("ProductA");
    }
}

class ProductB implements IProduct {
    @Override
    public void use() {
        System.out.println("ProductB");
    }
}
// 简单工厂
public class SimpleFactory {
    public IProduct produce(String name) {
        if("A".equals(name)) {
            return new ProductA();
        } else if("B".equals(name)) {
            return new ProductB();
        }
        return null;
    }
}
// 客户端
public class Client {
    public static void main(String[] args) {
        SimpleFactory factory = new SimpleFactory();
        IProduct pa = factory.produce("A");
        IProduct pb = factory.produce("B");
        pa.use();
        pb.use();
    }
}

工厂方法

工厂方法通过一个接口将具体实例化的工作延迟到子类,工厂类不再负责所有产品的创建。当增加新产品时只需添加对应的工厂即可,做到了“对修改关闭,对扩展开放”,但是当产品种类非常多时,会出现大量的与之对应的工厂对象。

// 产品
public interface IProduct {
    void use();
}

class ProductA implements IProduct {
    @Override
    public void use() {
        System.out.println("ProductA");
    }
}

class ProductB implements IProduct {
    @Override
    public void use() {
        System.out.println("ProductB");
    }
}
// 工厂
public interface IFactory {
    IProduct produce();
}

class FactoryA implements IFactory {
    @Override
    public IProduct produce() {
        return new ProductA();
    }
}

class FactoryB implements IFactory {
    @Override
    public IProduct produce() {
        return new ProductB();
    }
}
// 客户端
public class Client {
    public static void main(String[] args) {
        IFactory fa = new FactoryA();
        IProduct pa = fa.produce();
        pa.use();

        IFactory fb = new FactoryB();
        IProduct pb = fb.produce();
        pb.use();
    }
}

抽象工厂

与工厂方法生产单个产品不同,抽象工厂模式通常用于创一族产品,并且这族产品分不同的等级。对于增加产品族只需要简单的添加相应的产品族工厂即可,但是要想添加一种新产品,抽象工厂模式无能为力,因为这要修改所有的产品族工厂。

// CPU等级的产品,分为Intel族和AMD族
public interface CPU {
    void use();
}

class CPU_Intel implements CPU {
    @Override
    public void use() {
        System.out.println("Intel CPU");
    }
}

class CPU_AMD implements CPU {
    @Override
    public void use() {
        System.out.println("AMD CPU");
    }
}
// 主板等级的产品,分为Intel族和AMD族
public interface Board {
    void use();
}

class Board_Intel implements Board {
    @Override
    public void use() {
        System.out.println("Board Intel");
    }
}

class Board_AMD implements Board {
    @Override
    public void use() {
        System.out.println("Board AMD");
    }
}
// 工厂接口
public interface IFactory {
    CPU produceCPU();
    Board produceBoard();
}
// Intel产品族的工厂
class IntelFactory implements IFactory {
    @Override
    public CPU produceCPU() {
        return new CPU_Intel();
    }

    @Override
    public Board produceBoard() {
        return new Board_Intel();
    }
}
// AMD产品族的工厂
class AMDFactory implements IFactory {
    @Override
    public CPU produceCPU() {
        return new CPU_AMD();
    }

    @Override
    public Board produceBoard() {
        return new Board_AMD();
    }
}
// 客户端
public class Client {
    public static void main(String[] args) {
        IFactory f1 = new IntelFactory();
        f1.produceCPU().use();
        f1.produceBoard().use();

        IFactory f2 = new AMDFactory();
        f2.produceCPU().use();
        f2.produceBoard().use();
    }
}

区别

  • 简单工厂:用来生产同一等级结构中的任意产品;对于增加新的产品无能为力
  • 工厂方法:用来生产同一等级结构中的固定产品;支持增加任意产品
  • 抽象工厂:用来生产不同产品族的全部产品;对于增加新的产品无能为力;支持增加产品族

实际应用

SAXParserFactory.newInstance();
Proxy.newProxyInstance()
Class.forName()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值