简单工厂模式(Simple Factory Pattern)

一、定义

简单工厂模式(Simple Factory Pattern):创新型模式之一,在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

二、UML类图

简单工厂模式(Simple Factory Pattern)_第1张图片

三、角色职责

  • 工厂角色(Creator):这是简单工厂模式的核心,由它负责创建所有的类的内部逻辑。当然工厂类必须能够被外界调用,创建所需要的产品对象。
  • 抽象产品角色(Product):简单工厂模式所创建的所有对象的父类,注意,这里的父类可以是接口也可以是抽象类,它负责描述所有实例所共有的公共接口。
  • 具体产品角色(Concrete Product):简单工厂所创建的具体实例对象,这些具体的产品往往都拥有共同的父类。

四、代码实现

前言:举个栗子,当我们需要创建一个篮球对象时,可以创建一个工厂去帮助我们创建不同我们所需要的篮球对象,而不用自己去进行new对象进行创建,我们只需要给这个工厂传入不同的参数,他就可以返回给我们不同的篮球对象,不需要关注其中创建的细节,实现了创建业务与使用业务的分离。

抽象篮球接口(抽象产品类 abstract Product)

public interface BasketBall {
    void shot();
}

阿迪达斯篮球(具体产品类 Concrete Product)

public class AdidasBasketBall implements BasketBall {
    @Override
    public void shot() {
        System.out.println("使用阿迪达斯篮球投篮");
    }
}

耐克篮球(具体产品类 Concrete Product)

public class NikeBasketBall implements BasketBall {
    @Override
    public void shot() {
        System.out.println("使用耐克篮球投篮");
    }
}

斯伯丁篮球(具体产品类 Concrete Product)

public class SpaldingBasketBall implements BasketBall {
    @Override
    public void shot() {
        System.out.println("使用斯伯丁篮球投篮");
    }
}

篮球工厂(工厂类 Creator)

public class BasketBallFactory {
    /**
     * 根据参数的不同返回不同类的篮球实例
     *
     * @param brand 品牌
     * @return 篮球实例
     */
    public static BasketBall make(String brand) {
        if ("Adidas".equals(brand)) {
            return new AdidasBasketBall();
        } else if ("Nike".equals(brand)) {
            return new NikeBasketBall();
        } else {
            return new SpaldingBasketBall();
        }
    }
}

测试类

public class SimpleFactoryTest {
    public static void main(String[] args) {
        // 使用阿迪达斯篮球投篮
        BasketBall adidas = BasketBallFactory.make("Adidas");
        adidas.shot();
        // 使用耐克篮球投篮
        BasketBall nike = BasketBallFactory.make("Nike");
        nike.shot();
        // 使用斯伯丁篮球投篮
        BasketBall spalding = BasketBallFactory.make("Spalding");
        spalding.shot();
    }
}

五、源码分析

JDK 中的Calendar 类中,就使用了简单工厂模式
简单工厂模式(Simple Factory Pattern)_第2张图片
我们进入createCalendar方法一探究竟。
简单工厂模式(Simple Factory Pattern)_第3张图片
可以看到,这里会根据aLocale对象的Unicode区域类型的不同,从而返回不同的实例。

public class CalendarTest {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        System.out.println("年:" + cal.get(Calendar.YEAR));
        System.out.println("月:" + (cal.get(Calendar.MONTH) + 1));
        System.out.println("日:" + cal.get(Calendar.DAY_OF_MONTH));
        System.out.println("时:" + cal.get(Calendar.HOUR_OF_DAY));
        System.out.println("分:" + cal.get(Calendar.MINUTE));
        System.out.println("秒:" + cal.get(Calendar.SECOND));
    }
}

我们在使用时,只需要传入不同的Calendar枚举,就可以获得不同的年月日时分秒的结果。

六、优缺点分析

优点

  • 工厂类包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。实现了对象创建和使用的分离,有利于整个软件体系结构的优化。

缺点

  • 由于工厂类集中了所有实例的创建逻辑,这就直接导致一旦这个工厂出了问题,所有的客户端都会受到牵连。
  • 简单工厂模式违背了“开放封闭原则”,当我新增加一个产品的时候必须修改工厂类,造成工厂角色无法形成基于继承的等级结构。

七、适用场景

适用于工厂类负责创建的对象比较少的场景,不会造成工厂方法中的业务逻辑太过复杂。

八、总结

简单工厂模式解决的问题是如何去实例化一个合适的对象。简单工厂模式的核心思想就是:有一个专门的类来负责创建实例的过程。具体来说,把产品看着是一系列的类的集合,这些类是由某个抽象类或者接口派生出来的一个对象树。而工厂类用来产生一个合适的对象来满足客户的要求。

你可能感兴趣的:(设计模式,简单工厂模式)