简单工厂模式

169 阅读2分钟

「这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战」。

一、工厂模式是什么

工厂模式属于创建型模式,它提供了一种创建对象的简单方式,在工厂模式中,我们创建对象的逻辑不会对使用工厂模式的人暴露,并且是通过使用一个共同的接口来创建不同的对象。

二、工厂模式的实现

public interface Dog {

    void say();
}

定义一只抽象的dog,假设狗狗会说话,不同的狗说不同的话。

public class BigDog implements Dog{
    @Override
    public void say() {
        System.out.println("I'm a big dog!");
    }
}
public class MiddleDog implements Dog{
    @Override
    public void say() {
        System.out.println("I'm a middle dog!");
    }
}
public class SmallDog implements Dog{
    @Override
    public void say() {
        System.out.println("I'm a small Dog");
    }
}

三种不同的狗狗,会说不同的话。定义一个工厂,可以创建三种不同的狗狗。在工厂中生成的狗狗,都是返回抽象的Dog,而不是具体的BigDog等,工厂就是一个生产产品的工厂,生产的就是狗狗这种产品。我们可以很方便的通过不同狗狗的名字,创建不同的狗狗,使用时也只需关心狗狗自身的接口。

public class DogFactory {
    public Dog getDog(String dogType){
        if (StringUtils.isBlank(dogType)){
            return null;
        }
        if (dogType.equals("big")){
            return new BigDog();
        }else if(dogType.equals("middle")){
            return new MiddleDog();
        }else if (dogType.equals("small")){
            return new SmallDog();
        }
        return null;
    }
}

下面我们使用工厂创建不同的狗狗,狗狗们都有共同的say的方法,但通过工厂创建的不同的狗狗,调用say后的表现也不一样。假设我们想要新增猫猫,只需要新增创建猫猫工厂,新增猫猫就相当于新增一种产品,多一种产品直接新建一个工厂类即可,即生产狗狗的工厂就只生产狗狗,生产猫猫就需要另一个工厂了。

public class FactoryTest {
    public static void main(String[] args) {
        DogFactory dogFactory = new DogFactory();
        Dog dogA = dogFactory.getDog("big");
        Dog dogB = dogFactory.getDog("middle");
        Dog dogC = dogFactory.getDog("small");
        dogA.say();
        dogB.say();
        dogC.say();
    }
}

image.png

三、工厂模式的使用场景

比较典型的是spring中的bean工厂,创建bean时采用了工厂模式,根据bean的名称来创建对象,spring要求bean的名称唯一。

优点是创建对象时,只需要知道名字,就可以创建想要的对象,而且工厂屏蔽产品的具体实现,调用者使用时只需关心产品的接口。

缺点:每新增一种产品就需要新增新的工厂和新的产品类,增加了系统的复杂性。