深入理解java的三种工厂模式

本文详细介绍了三种常见的工厂模式:简单工厂模式、工厂方法模式和抽象工厂模式。简单工厂模式适用于简单场景,但扩展性不足;工厂方法模式通过接口实现了更好的扩展性,但仍存在局限;抽象工厂模式则更进一步,允许创建产品族内的所有对象,提供了更高的灵活性。通过示例代码展示了每个模式的应用和特点。
摘要由CSDN通过智能技术生成

一、简单工厂模式

工厂类角色: 这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。

抽象产品角色: 它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。

具体产品角色: 工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。

// 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。
abstract class Car {
    public abstract void drive();
}

class BmwCar extends Car {
    @Override
    public void drive() {
        System.out.println("开始驾驶宝马汽车");
    }
}

// 具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。
class AudiCar extends Car {
    @Override
    public void drive() {
        System.out.println("开始驾驶奥迪汽车");
    }
}

// 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。
class CarFactory {
    public static Car getCar(String name) {
        if ("宝马".equals(name)) {
            return new BmwCar();
        } else if ("奥迪".equals(name)) {
            return new AudiCar();
        }else{
            throw new RuntimeException("没有这种汽车");
        }
    }
}

public class Test {
    public static void main(String[] args) {
        Car car = CarFactory.getCar("奥迪");
        car.drive();
    }
}

分析: 实现简单,但是扩展的时候需要更改CarFactory类中的方法,扩展性不好

二、工厂方法模式

抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。

具体工厂角色: 它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。

抽象产品角色: 它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。

具体产品角色: 具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。

// 抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
abstract class Car {
    public abstract void drive();
}

// 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
class BmwCar extends Car {
    @Override
    public void drive() {
        System.out.println("开始驾驶宝马汽车");
    }
}

// 具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。
class AudiCar extends Car {
    @Override
    public void drive() {
        System.out.println("开始驾驶奥迪汽车");
    }
}

// 抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
abstract class CarFactory {
    public abstract Car getCar();
}

// 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。
class BmwCarFactory extends CarFactory {
    @Override
    public Car getCar() {
        return new BmwCar();
    }
}

// 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。
class AudiCarFactory extends CarFactory {
    @Override
    public Car getCar() {
        return new AudiCar();
    }
}

public class Test {
    public static void main(String[] args) {
        CarFactory carFactory = new AudiCarFactory();
        Car car = carFactory.getCar();
        car.drive();
    }
}

**分析:**虽然需要多些一个Car类的实现类和CarFactory类的实现类,但是扩展性还是可以的,不过太笼统,没有细分,毕竟宝马下面有运动系列、商务车等等

三、抽象工厂模式

注意:相当于 简单工厂模式 和 工厂方法模式 的组合模式

先来认识下什么是产品族:位于不同产品等级结构中,功能相关联的产品组成的家族。如果光看这句话就能清楚的理解这个概念,我不得不佩服你啊。还是让我们用一个例子来形象地说明一下吧。

图中的BmwCar和AudiCar就是两个产品树(产品层次结构);而如图所示的BmwSportsCar和AudiSportsCar就是一个产品族。他们都可以放到跑车家族中,因此功能有所关联。同理BmwBussinessCar和AudiBussinessCar也是一个产品族。

回到抽象产品模式的话题上,可以这么说,它和工厂方法模式的区别就在于需要创建对象的复杂程度上。而且抽象工厂模式是三个里面最为抽象、最具一般性的。抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象。而且使用抽象工厂模式还要满足一下条件:

  1. 系统中有多个产品族,而系统一次只可能消费其中一族产品
  2. 同属于同一个产品族的产品以其使用。

来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):

抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。

具体工厂角色: 它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。

抽象产品角色: 它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。

具体产品角色: 具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。

// 抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
abstract class Car {
    public abstract void drive();
}

// 产品树
abstract class BmwCar extends Car {
}

// 产品树
abstract class AudiCar extends Car {
}

// 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。(产品族)
class BmwSportCar extends BmwCar {
    @Override
    public void drive() {
        System.out.println("开始驾驶宝马运动汽车");
    }
}

// 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。(产品族)
class BmwBusinessCar extends BmwCar {
    @Override
    public void drive() {
        System.out.println("开始驾驶宝马商务汽车");
    }
}

// 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。(产品族)
class AudiSportCar extends AudiCar {
    @Override
    public void drive() {
        System.out.println("开始驾驶奥迪运动汽车");
    }
}

// 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。(产品族)
class AudiBusinessCar extends AudiCar {
    @Override
    public void drive() {
        System.out.println("开始驾驶奥迪商务汽车");
    }
}

// 抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
abstract class CarFactory {
    public abstract Car getCar(String type);
}

// 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。
class BmwCarFactory extends CarFactory {
    @Override
    public Car getCar(String type) {
        if ("运动".equals(type)) {
            return new BmwSportCar();
        } else if ("商务".equals(type)) {
            return new BmwBusinessCar();
        } else {
            throw new RuntimeException("宝马没有该类型车");
        }
    }
}

// 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。
class AudiCarFactory extends CarFactory {
    @Override
    public Car getCar(String type) {
        if ("运动".equals(type)) {
            return new AudiSportCar();
        } else if ("商务".equals(type)) {
            return new AudiBusinessCar();
        } else {
            throw new RuntimeException("奥迪没有该类型车");
        }
    }
}

public class Test {
    public static void main(String[] args) throws Exception {
        CarFactory carFactory = new AudiCarFactory();
        Car car = carFactory.getCar("商务");
        car.drive();
    }
}

分析: 相当于 简单工厂模式 和 工厂方法模式 的组合模式,可以深入到细分领域,想要什么车型就创建什么车型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值