简介 工厂模式是创建型模式的一种,也是里面需要注意的点最少的一种设计模式。通常来说,工厂模式有简单工厂、工厂方法和抽象工厂三种,其中前两种实现较为简单,后面一种比较复杂,这里先将简单工厂和工厂方法放一起,抽象工厂单独写一篇。简单工厂 简单工厂适用于工厂类型确定的情况,在工厂中通过传入的类型来创建对应的对象。传统的写法如下(以创建各种水果为例):1。首先定义水果的接口和方法:publicinterfaceFruit{StringgetType();} 2。定义实现类(这里定义了Circle和Square)publicclassAppleimplementsFruit{OverridepublicStringgetType(){}}publicclassPearimplementsFruit{OverridepublicStringgetType(){}} 3。定义一个跟图形映射的静态常量(非必须,本人习惯,这样可以避免魔鬼字符串,并且方便代码重构)publicinterfaceType{StringAPPLEStringPEAR} 4。定义图形工厂publicclassFruitFactory{publicstaticFruitcreateFruit(Stringtype){if(type。equals(Type。PEAR)){returnnewPear();}elseif(type。equals(Type。APPLE)){returnnewApple();}}} 5。客户端调用publicclassTest{publicstaticvoidmain(String〔〕args){FruitfruitFruitFactory。createFruit(Type。APPLE);System。out。println(fruit。getType());appleFruitfruit1FruitFactory。createFruit(Type。PEAR);System。out。println(fruit1。getType());pear}}关于简单工厂 简单工厂应该是设计模式中最简单的一种,能满足一部分需求。该工厂最大的一个问题是违反了开闭原则,比如我现在要增加另一种水果,则必须在FruitFactory类中去增加,会修改这个类,我们辛辛苦苦加班写的代码,肯定是不想被别人去修改的。工厂方法 如果简单工厂能满足我们的需求,就没有必要上工厂方法了,因为工厂方法会创建多个工厂,无疑增加了我们的维护成本。对于工厂方法,我们还是以创建水果为例,假设我们的苹果和梨有两种,分别时南方的和北方的,此时我们需要南方水果工厂来创建南方的水果,北方的水果工厂来创建北方的水果。步骤如下:1。定义水果的接口:publicinterfaceFruit{StringreturnType();} 2。定义南方和北方苹果和梨,实现Fruit接口publicclassNorthAppleimplementsFruit{OverridepublicStringreturnType(){}}publicclassNorthPearimplementsFruit{OverridepublicStringreturnType(){}}publicclassSouthAppleimplementsFruit{OverridepublicStringreturnType(){}}publicclassSouthPearimplementsFruit{OverridepublicStringreturnType(){}} 3。定义生产水果的工厂接口publicinterfaceFruitFactory{FruitcreateFruit(Stringtype);} 4。定义南方和北方的水果工厂,实现FruitFactorypublicclassNorthFruitFactoryimplementsFruitFactory{OverridepublicFruitcreateFruit(Stringtype){if(type。equals(Type。APPLE)){returnnewNorthApple();}elseif(type。equals(Type。PEAR)){returnnewNorthPear();}}}publicclassSouthFruitFactoryimplementsFruitFactory{OverridepublicFruitcreateFruit(Stringtype){if(type。equals(Type。APPLE)){returnnewSouthApple();}elseif(type。equals(Type。PEAR)){returnnewSouthPear();}}} 5。客户端调用publicclassTest{publicstaticvoidmain(String〔〕args){FruitFactoryfruitFactorynewSouthFruitFactory();FruitfruitfruitFactory。createFruit(Type。APPLE);System。out。println(fruit。returnType());applefromsouthSystem。out。println();FruitFactoryfruitFactory1newNorthFruitFactory();Fruitfruit1fruitFactory1。createFruit(Type。PEAR);System。out。println(fruit1。returnType());pearfromnorth}}