专栏首页FoamValue工厂模式 Factory Pattern

工厂模式 Factory Pattern

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

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


简单工厂模式

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

一个简单的演示如下

演示代码

// 汽车产品接口类
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();
        }
    }
}

运行结果


工厂方法模式

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

演示改成如下

演示代码

// 创建抽象工厂类
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 等。

不再详细展开

各个角色介绍

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

总结

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

本文分享自微信公众号 - FoamValue(gh_3c635269f459),作者:陈鑫杰

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-10-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 「拥抱开源」从零开始 Docker、Mysql & JPA

    为了降低项目成本,我们有一套完整的 MySQL 开源社区版集群。希望能在低成本的基础上,带来期望的收益。

    FoamValue
  • 策略模式 Strategy Pattern

    Strategy Pattern,是 Java 常用的设计模式之一。它提供了一个类的行为或其算法在运行时可以更改的能力。

    FoamValue
  • 三分钟写一个 Java 多线程

    作为一个`老`程序员,我本身是很少会使用多线程去实现业务逻辑的。原因主要有以下两点:

    FoamValue
  • 抽象类能实例化吗?——口气很强硬——“不能”(详解)

     这个问题我想了一个晚上,看了好几篇别人的博客,但结果都各不相同,每个人有每个人的理解,后来我想明白了:

    泰斗贤若如
  • 抽象类和接口到底是什么“垃圾“——教你分类

      这几天给别人讲JavaSE基础,又把面向对象看了一遍,讲的时候发现一个问题,就是当时讲抽象类和接口的时候说接口也是抽象类,是个特殊的抽象类,当时听的时候别人...

    泰斗贤若如
  • 图图谈设计模式_原型设计模式_java

    那为什么呢,原因很简单,效率高。最近做项目就用到该模式,实体A关联实体B,B关联实体C。而通过实现序列化和反序列化的深度复制,只需复制A,那么关联的对象都可以同...

    聚沙成塔
  • JavaSE(四)之接口、访问控制

    上面我们学习了几个修饰符,在开发中经常会用的到,所以必须熟练的掌握。接下来我学习一下接口和访问控制。 一、接口 一系列方法的声明,是一些方法特征的集合,一个接口...

    用户1195962
  • (08)通过和 ServletAPI 耦合的方式获取 WEB 资源

    qubianzhong
  • encoding/hex

    func Encode(dst,src []byte)int func EncodeToString(src []byte)string func Deco...

    酷走天涯
  • 设计模式之简单工厂模式(创建型)

    简单工厂模式又称静态工厂模式。可以根据参数的不同返回不同类的实例。定义一个类来创建其它类的实例。

    SmileNicky

扫码关注云+社区

领取腾讯云代金券