工厂模式(单工厂,多工厂)


什么是工厂模式(结合百度百科来理解)

简单来说,工厂模式就是用来实例化对象的,因为实际开发中,一个类会有很多个属性,如果在new的时候同时初始化,则代码会显得臃肿(比如,你现在要创建很多个不同的类,同时还要初始化,这些代码全部堆在一起,就很难看),工厂模式则能解决这个问题,工厂模式中,将对象的创建和使用分开了

工厂模式的分类(单工厂,多工厂:接口和抽象)

这几个分类是我自己这么分,我觉得比分成简单工厂和抽象工厂更细致,更易于理解

单工厂(只有一个工厂用来创建对象)

单工厂中通过if...else来控制创建哪种对象,将臃肿的初始化代码封装,在工厂类中创建,在其他地方使用时通过简单的调用即可初始化

缺点:如果以后需要增加其他的类,工厂类中则会又加上一个if,这不仅会使得工厂类越来越臃肿,而且还改动了以前的代码,可能会出错,因此单工厂不适用于要创建很多对象的情况

//首先需要一个接口
public interface Language {
    public void say();
}
//创建几个需要实例化的类
public class Chinese implements Language {
    //实际中这个类有很多属性需要初始化


    @Override
    public void say() {
        System.out.println("你好!");
    }
}
public class English implements Language {
    //实际中这个类有很多属性需要初始化

    @Override
    public void say() {
        System.out.println("hello!");
    }
}
public class Factory {
    //在工厂中创建实例化对象
    public static Language speak(String kind) {
        if (kind == "Chinese") {
            Language language = new Chinese();
            //100行初始化代码
            return language;
        } else if (kind == "English") {
            Language language = new English();
            //100行初始化代码
            return language;
        } else {
            throw new IllegalArgumentException("请修改参数kind,无法实例化该语言的对象");
        }

    }

    //测试一下
    public static void main(String[] args) {

        Language chinese = Factory.speak("Chinese");
        chinese.say();
        Language english = Factory.speak("English");
        english.say();
        Language other = Factory.speak("other");//这里就会报错
        other.say();

    }
}

 接口多工厂

多工厂是对单工厂的进一步优化,因为单工厂里面又很多的if语句,导致单工厂类非常的臃肿,所以可以写一个工厂接口,这个接口可以被很多工厂类实现,每一个工厂类都有唯一的实体类与之对应

缺点:虽然优化了单工厂,但是多工厂的类是成对增加的,也会造成一定的开销

public interface Factory {
    public Language speak();

    //测试一下
    public static void main(String[] args) {
        ChineseFactory chineseFactory = new ChineseFactory();
        EnglishFactory englishFactory = new EnglishFactory();
        Language chinese = chineseFactory.speak();
        Language english = englishFactory.speak();
        chinese.say();
        english.say();
    }
}
public class ChineseFactory implements Factory {
    @Override
    public  Language speak() {
        Language language = new Chinese();
        //100行初始化代码
        return language;
    }
}

 抽象多工厂

其实抽象工厂和接口工厂差不多,主要区别就是接口多工厂使用的是接口,而抽象工厂使用的是抽象类,抽象工厂中可以包含方法的具体实现,接口中则全部都是抽象的,二者的区别可参照抽象类和接口的区别