Life with teacher Lemon.

详解工厂模式-简单工厂

2021.01.04 | 共 859 字,阅读需约 2 分钟.

工厂模式

工厂模式属于创建型模式,主要分为简单工厂、工厂方法以及抽象工厂三种类型,其核心思想是针对接口的不同实现类的实例化,即不同条件下,创建不同的子类。

简单工厂

简单工厂又叫做静态工厂(Static Factory Method),是工厂模式的一种特殊实现,由一个工厂类根据不同的参数创建不同的子类对象。例如有这么一句诗,春赏百花秋赏月,夏有凉风冬有雪,一年有四季,四季各有不同的美景,每个季节都有固定的月份,那么我们可以通过当前的月份,利用简单工厂模式来告知我们现在处于哪个季节。

首先我们抽象一下季节的接口,如下我们定义了季节接口,并提供一个拟人化行为接口,让四季告诉我们有什么美景。

季节接口

/**
 * 季节
 */
public interface Seasons {
    void say();
}

其次,我们创建四季的实现类,并让每个季节说出自己的特色。

四季实现类

/**
 * 春
 */
public class Spring implements Seasons {
    public void say() {
        System.out.println("春赏百花");
    }
}

/**
 * 夏
 */
public class Summer implements Seasons {
    public void say() {
        System.out.println("夏有凉风");
    }
}

/**
 * 秋
 */
public class Autumn implements Seasons {
    public void say() {
        System.out.println("秋赏月");
    }
}

/**
 * 冬
 */
public class Winter implements Seasons {
    public void say() {
        System.out.println("冬有雪");
    }
}

接着,我们定义一下工厂类,创建不同的季节。

简单工厂类

/**
 * 季节工厂
 */
public class SeasonsFactory {
    private SeasonsFactory() {}

    /**
     * 根据不同月份返回相应的季节
     * @param month 月份
     * @return 季节
     * @throws Exception 异常
     */
    public static Seasons getSeasons(int month) {
        if (month > 12 || month < 0) {
            return null;
        }
        if (month > 9) {
            return new Winter();
        } else if (month > 6) {
            return new Autumn();
        } else if (month > 3) {
            return new Summer();
        } else {
            return new Spring();
        }
    }
}

最后,对于客户来说,只想知道现在这个月份有什么美景,而不用关心具体是什么季节。

客户端

public class Client {
    public static void main(String[] args) {
        Seasons seasons = SeasonsFactory.getSeasons(3);
        seasons.say();
        seasons = SeasonsFactory.getSeasons(9);
        seasons.say();
        seasons = SeasonsFactory.getSeasons(6);
        seasons.say();
        seasons = SeasonsFactory.getSeasons(12);
        seasons.say();
    }
}

简单工厂提供了一个静态的创建方法,根据不同入参创建不同的接口实现,优点是对于客户端来说,很好的屏蔽了接口的实现类,而缺点是在实现类不断增加的情况下,需要不停的增加创建对象的分支,违反了开闭原则,因此,简单工厂适合于创建接口实现类较少的场景。

发表评论
今日诗词