前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >工厂模式 Factory Pattern

工厂模式 Factory Pattern

作者头像
FoamValue
发布2020-11-06 13:18:50
3400
发布2020-11-06 13:18:50
举报
文章被收录于专栏:FoamValueFoamValue

Factory Pattern,是 Java 常用的设计模式之一。它提供了一种与创建逻辑无关的创建实例的能力。

本文主要介绍工厂模式的两种实现方式:简单工厂模式、工厂方法模式。希望通过两种实现方式来加深对工厂模式的理解。


简单工厂模式

简单工厂模式,又称静态工厂方法模式。由一个静态方法根据传入参数的不同,来实现动态生产不同产品类实例的功能。

一个简单的演示如下

演示代码

代码语言:javascript
复制
// 汽车产品接口类
public interface Car {
    public void drive();
}
// 不同的汽车产品类
public class Audi implements Car {
    @Override
    public void drive() {
        System.out.println("Driving AUDI Sedans");
    }
}
public class Benz implements Car {
    @Override
    public void drive() {
        System.out.println("Driving BENZ Sedans");
    }
}
public class Bwm implements Car {
    @Override
    public void drive() {
        System.out.println("Driving BWM Sedans");
    }
}
// 简单工厂类
public class SimpleFactory {
    public static Car drive(String carType) {
        if (StringUtils.isBlank(carType)) {
            throw new RuntimeException("carType can not be empty.");
        }
        Car car = null;
        switch (carType.toLowerCase()) {
            case "bwm":
                car = new Bwm();
                break;
            case "benz":
                car = new Benz();
                break;
            case "audi":
                car = new Audi();
                break;
            default:
                throw new RuntimeException("invalid data.");
        }
        return car;
    }
}
// 测试类
public class SimpleFactoryTest {
    @org.junit.Test
    public void drive() {
        Car car = SimpleFactory.drive("Bwm");
        if (car != null) {
            car.drive();
        }
        car = SimpleFactory.drive("BENZ");
        if (car != null) {
            car.drive();
        }
        car = SimpleFactory.drive("audi");
        if (car != null) {
            car.drive();
        }
    }
}

运行结果


工厂方法模式

工厂方法使用一个抽象工厂来代替简单工厂模式中的工厂类。

演示改成如下

演示代码

代码语言:javascript
复制
// 创建抽象工厂类
public abstract class CarFactory {
    abstract public Car drive();
}
// 三个产品的实现类
public class AudiFactory extends CarFactory {
    @Override
    public Car drive() {
        return new Audi();
    }
}
public class BenzFactory extends CarFactory {
    @Override
    public Car drive() {
        return new Benz();
    }
}
public class BwmFactory extends CarFactory {
    @Override
    public Car drive() {
        return new Bwm();
    }
}
// 测试类
public class CarFactoryTest {
    @org.junit.Test
    public void drive() {
        CarFactory factory = new BwmFactory();
        Car car = factory.drive();
        if (car != null) {
            car.drive();
        }
        factory = new BenzFactory();
        car = factory.drive();
        if (car != null) {
            car.drive();
        }
        factory = new AudiFactory();
        car = factory.drive();
        if (car != null) {
            car.drive();
        }
    }
}

运行结果


抽象工厂模式

抽象工厂模式,是工厂方法模式的超级升级版本。引入了抽象工厂角色(AbstractFactory)的概念,通过抽象工厂角色来创建具体的工厂类。例如 通过 AbstractFactory 来创建不同的 Car 工厂类实例 PublicCarFactory、SportCarFactory、BusCarFactory 等。

不再详细展开

各个角色介绍

  • 抽象工厂角色,与业务逻辑无关,是具体工厂角色必须实现的接口或继承的父类。
  • 具体工厂角色,具体的、用来创建对应具体产品角色的业务逻辑相关代码。
  • 抽象产品角色,与业务逻辑无关,是具体产品角色必须实现的接口或继承的父类。
  • 具体产品角色,具体的、被具体工程角色创建的实例,内部实现了具体产品特性的业务逻辑相关代码。

总结

工厂模式的存在,给我们创建具体实例带来了便利。特别是高配版的抽象工厂模式,在新产品需求出现的情况下,可以在不修改原有功能的基础上,通过扩展新的产品类、新的产品工厂类进行实现。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-10-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FoamValue 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档