Java学习----工厂方法模式

        在面向对象设计模式中,分为三大模式,其中,创建型模式用于处理对象的创建过程,而工厂模式是其中的重要组成部分。工厂方法模式和抽象工厂模式作为工厂模式的两种主要形式,在软件开发中被广泛应用,用于解耦对象的创建与使用。

        工厂方法模式是一种创建型设计模式,它定义了一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。​简单来说,就是将对象的创建工作交给专门的工厂类或其子类来完成,客户端只需要关注所需产品的接口,而无需知道具体的实现类。​

        工厂方法模式的核心原理是通过引入抽象工厂和具体工厂,将产品的创建过程封装起来。其结构包含以下几个关键角色:​

(1)抽象产品:定义了产品的接口,是所有具体产品的父类。​

(2)具体产品:实现了抽象产品接口,是工厂方法模式所创建的目标对象。​

(3)抽象工厂:声明了工厂方法,该方法返回一个抽象产品类型的对象。​

(4)具体工厂:实现了抽象工厂的工厂方法,根据需求创建并返回具体产品的实例。​

        客户端通过调用具体工厂的工厂方法来获取产品对象,而无需直接实例化具体产品类,从而实现了对象创建与使用的分离。​

        工厂方法模式的主要作用体现在以下几个方面:​

(1)解耦对象创建与使用:客户端不需要知道具体产品的类名,只需知道对应的工厂即可,降低了客户端与具体产品类之间的耦合度。​

(2)提高扩展性:当需要添加新的产品时,只需新增一个具体产品类和对应的具体工厂类,无需修改现有代码,符合开闭原则。​

(3)便于测试:可以通过替换具体工厂来使用不同的产品实现,方便进行单元测试。​

        工厂方法模式的优点主要有:

(1)符合开闭原则:新增产品时无需修改原有代码,只需添加新的具体产品和具体工厂。​

(2)客户端无需知道具体产品的类名,只需关注工厂和产品接口,简化了客户端的使用。​

(3)有利于代码的封装和复用,将对象创建的逻辑集中在工厂类中。​

        同样的,其也有不少缺点,例如:

(1)每增加一个具体产品,就需要增加一个对应的具体工厂类,这会导致系统中类的数量增多,增加了系统的复杂度。​

(2)客户端需要知道具体工厂的存在才能获取所需产品,在一定程度上暴露了工厂的实现。​

        以汽车生产为例,这里使用工厂方法模式演示:​

//定义抽象产品
public interface Car {
    void drive();
}
//定义具体产品(BMWCar、BenzCar)
public class BMWCar implements Car {
    @Override
    public void drive() {
        System.out.println("驾驶宝马汽车");
    }
}

public class BenzCar implements Car {
    @Override
    public void drive() {
        System.out.println("驾驶奔驰汽车");
    }
}
//定义抽象工厂
public interface CarFactory {
    Car createCar();
}
//定义具体工厂
public class BMWFactory implements CarFactory {
    @Override
    public Car createCar() {
        return new BMWCar();
    }
}

public class BenzFactory implements CarFactory {
    @Override
    public Car createCar() {
        return new BenzCar();
    }
}
//客户端使用
public class Client {
    public static void main(String[] args) {
        CarFactory bmwFactory = new BMWFactory();
        Car bmw = bmwFactory.createCar();
        bmw.drive();

        CarFactory benzFactory = new BenzFactory();
        Car benz = benzFactory.createCar();
        benz.drive();
    }
}

        工厂方法模式与抽象工厂模式的差异​主要有:

(1)产品范围不同:工厂方法模式只针对单一产品等级结构,即一个工厂只生产一种类型的产品;而抽象工厂模式针对产品族,一个工厂可以生产多个相关的产品,这些产品属于不同的产品等级结构。​

(2)工厂接口定义不同:工厂方法模式的抽象工厂只声明一个创建产品的方法;抽象工厂模式的抽象工厂声明多个创建不同产品的方法,每个方法对应一种产品。​

(3)灵活性不同:工厂方法模式在扩展新的产品时,只需新增具体产品和具体工厂,灵活性较好;抽象工厂模式扩展新的产品族方便,但扩展新的产品等级结构困难。​

(4)适用场景不同:工厂方法模式适用于需要创建单一产品,且产品可能会有不同实现的场景;抽象工厂模式适用于需要创建一系列相关产品,且这些产品构成产品族,需要保证它们之间一致性的场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值