工厂模式(单工厂,多工厂)
什么是工厂模式(结合百度百科来理解)
简单来说,工厂模式就是用来实例化对象的,因为实际开发中,一个类会有很多个属性,如果在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; } }
抽象多工厂
其实抽象工厂和接口工厂差不多,主要区别就是接口多工厂使用的是接口,而抽象工厂使用的是抽象类,抽象工厂中可以包含方法的具体实现,接口中则全部都是抽象的,二者的区别可参照抽象类和接口的区别