「这是我参与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();
}
}
三、工厂模式的使用场景
比较典型的是spring中的bean工厂,创建bean时采用了工厂模式,根据bean的名称来创建对象,spring要求bean的名称唯一。
优点是创建对象时,只需要知道名字,就可以创建想要的对象,而且工厂屏蔽产品的具体实现,调用者使用时只需关心产品的接口。
缺点:每新增一种产品就需要新增新的工厂和新的产品类,增加了系统的复杂性。