设计模式-简单工厂模式

简介

虽然简单工厂模式并不是GOF23中设计模式之一,但还是有必要了解一下。

为什么要使用简单工厂模式

通过简单工厂模式,可以将产品的实例化封装起来,调用者无需关心产品的实例化过程,只需使用工厂即可得到自己想要的产品。

什么是简单工厂模式
简单工厂模式(Simple Factory Pattern):定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。

别名

静态工厂方法(Static Factory Method)模式

类型

类创建型模式

角色

角色

  • 产品接口。产品接口的主要目的是定义产品的规范,所有的产品实现都必须遵循产品接口定义的规范。
  • 产品实现。实现产品接口的具体类,决定了产品在客户端中的具体行为。
  • 静态工厂。在编程中,工厂实现决定如何实例化产品。

UML类图
simpleFactory.png

实现

  • 创建一个产品接口IProduct.java
  • 创建实现IProduct接口的产品类ProductA.java、ProductB.java
  • 创建静态工厂类ProductFactory
  • 创建测试类FactoryPatternDemo.java

产品接口
IProduct.java

public interface IProduct {
       void get();
}

产品
ProductA.java

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

ProductB.java

public class ProductB implements IProduct {

    @Override
    public void get() {
        System.out.println("get ProductB");
    }
}

工厂

ProductFactory.java

public class ProductFactory {

    public IProduct getProduct(String productType) {
        if ("ProductA".equalsIgnoreCase(productType)) {
            return new ProductA();
        } else if ("ProductB".equalsIgnoreCase(productType)) {
            return new ProductB();
        }
        return null;
    }
}

测试类FactoryPatternDemo.java

public class FactoryPatternDemo {

    public static void main(String[] args) {
        ProductFactory productFactory = new ProductFactory();

        IProduct productA = productFactory.getProduct("ProductA");
        productA.get();

        IProduct productB = productFactory.getProduct("ProductB");
        productB.get();
}

测试

get ProductA
get ProductB

优缺点

优点

  • 封装。产品类的实例化有时候是比较复杂和多变的,通过工厂模式,将产品的实例化封装起来,调用者无需关心产品的实例化过程,只需依赖工厂即可得到自己想要的产品。

缺点
违反了“开闭原则”。简单工厂通过构造时传入的标识来生产产品,不同产品都在同一个工厂中生产,这种判断会随着产品的增加而增加,给扩展和维护带来麻烦。因为没有工厂接口,所以在工厂实现的扩展性方面稍弱。

适用环境

在以下情况下可以使用简单工厂模式:

  • 工厂类负责创建的对象比较少。由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
  • 客户端只需要传入工厂类的参数,对于如何创建对象不需要关心。客户端不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数即可创建对应产品。

使用场景

根据传入参数的不同构建不同类型的对象。比如,数据库访问,当用户不知道最后系统采用哪一类数据库,以及使用的数据库可能有变化时。如从Oracle切换到MySQL,只需要更改配置文件中的参数就可以了。PS:这里只是举个例子,面试的时候最好不要举这个例子。。。

问题

如果需求产生了变化,增加一个产品C,该如何办?

需要增加一个具体类,和修改工厂。简单工厂模式的问题就在于产品和工厂还是没有完全解耦,绑定在一起的。每当新增一种产品时,你都需要去维护工厂中的判断语句,造成的后果就是可能这个工厂类判断语句太过庞大,给扩展和维护带来很多麻烦。所以,简单工厂通过构造时传入的标识来生产产品,不同产品都在同一个工厂中生产,这种判断会随着产品的增加而增加,给扩展和维护带来麻烦。使用工厂模式可以解决这个问题。

在软件开发中,你在哪里用到了简单工厂模式?
面试的时候经常被问到,好好想想吧^^

本文已收录于专栏:24种设计模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值