工厂模式的实现主要分为三种,分别是简单工厂模式(Simple factory)、工厂方法模式(Factory Method)和抽象工厂模式(Abastract Factory );但是简单工厂模式不属于23种GOF设计模式之一。工厂模式在各种开源框架里使用非常普遍,例如Spring框架大量使用工程模式。下面分别介绍一下这三种实现。

0x01: 简单工厂模式

简单工厂模式也被称为静态工厂模式;简单工厂模式可以将产品的使用和生产完全分开,客户端只需要知道需要什么产品,如何来使用产品就可以了,而具体的产品生产任务由具体的工厂类来实现。工厂类根据传进来的参数生产具体的产品供消费者使用。这种模式使得更加利于扩展,当有新的产品加入时仅仅需要在工厂中加入新产品的构造就可以了。类图如下

简答工厂设计模式及其分类(一个即可简单实现)(1)

简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。该模式中包含的角色及其职责:

抽象产品(IProduct)角色

publicinterfaceIFruit{ /** *种植水果方法 */ voidplant(); }

抽象产品(IProduct)角色

//实现种植苹果 publicclassAppleimplementsIFruit{ publicvoidplant(){ System.out.println("种植苹果"); } } //实现种植橙子 publicclassOrangeimplementsIFruit{ publicvoidplant(){ System.out.println("种植橙子"); } }

具体产品(Concrete Product)角色

publicclassPlantFruitsFactory{ public staticIFruitplantFruit(StringfruitType){ //这里使用的if判断,用switch一样的道理 if("Apple".equals(fruitType)){ returnnewApple(); }elseif("Orange".equals(fruitType)){ returnnewOrange(); }else{ returnnull; } } }

测试用例

publicclassClientCmd{ publicstaticvoidmain(String[]args){ IFruitfruit=PlantFruitsFactory.plantFruit("Apple"); fruit.plant(); fruit=PlantFruitsFactory.plantFruit("Orange"); fruit.plant(); } }

0x02: 工厂方法模式

工厂方法(Factory Method)模式的定义是一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅是负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。类图如下:

简答工厂设计模式及其分类(一个即可简单实现)(2)

抽象产品(Product)角色

//抽象产品类 publicabstractclassIMessage{ //抽象产品方法 publicvoidsend(); }

具体产品(Concrete Product)角色

//继承抽象类实现产品EmailMessage类 publicclassEmailMessage extendsIMessage{ //实现抽象产品方法 @Overide publicvoid send(){ System.out.println("send Email Message~~"); } } //继承抽象类实现产品SmsMessage类 publicclassSmsMessage extendsIMessage{ //实现抽象产品方法 @Overide publicvoid send(){ System.out.println("send Sms Message ~~~ "); } }

抽象工厂(Creator)角色

//工厂抽象类 publicabstractclassFactory{ //抽象工厂方法 publicabstractIMessage createMessage(); }

具体工厂(Concrete Creator)角色

//具体工厂类EmailMessageFactory publicclassEmailMessageFactoryextendsFactory{ @Overide publicIMessage createMessage(){ System.out.println("生产了一个EmailMessage "); returnnewEmailMessage(); } } //具体工厂类SmsMessageFactory publicclassSmsMessageFactoryextendsFactory{ @Overide publicIMessage createMessage(){ System.out.println("生产了一个SmsMessage"); returnnewSmsMessage(); } }

测试用例

//调用方代码 publicclassClientCmd{ publicstaticvoidmain(String[]args){ //产生一个Email工厂 Factoryfactory=newEmailMessageFactory(); factory.createMessage().send(); //产生一个短信工厂 factory=newSmsMessageFactory(); orangeFactory.createMessage().send(); } }

0x03: 抽象工厂模式

抽象工厂模式相对于工厂方法模式来说,就是工厂方法模式是针对一个产品系列的,而抽象工厂模式是针对多个产品系列的,即工厂方法模式是一个产品系列一个工厂类,而抽象工厂模式是多个产品系列一个工厂类。在抽象工厂模式中,客户端不再负责对象的创建,而是把这个责任丢给了具体的工厂类,客户端只负责对对象的调用,从而明确了各个类的职责。并且当一系列相互关联的产品被设计到一个工厂类里后,客户端的调用将会变得非常简单,而且如果要更换这一系列的产品,则只需要更换一个工厂类即可。类图如下

简答工厂设计模式及其分类(一个即可简单实现)(3)

抽象工厂模式中存在四种角色,分别是抽象工厂角色,具体工厂角色,抽象产品角色,具体产品角色

抽象产品角色

//抽象形状类 publicabstractclassShape{ publicabstractvoidsayShape(); } //抽象颜色类 publicabstractclassColor{ publicabstractvoidsayColor(); }

具体产品角色

//矩形类 publicclassRetangleextendsShape{ @Overide publicvoidsayShape(){ System.out.println("Hi,I'mRetangle!"); } } //圆形类 publicclassCircleextendsShape{ @Overide publicvoidsayShape(){ System.out.println("Hi,I'mCircle!"); } } //红色类 publicclassRedextendsColor{ @Overide publicvoidsayColor(){ System.out.println("Hi,I'mRed!"); } } //白色类 publicclassWhiteextendsColor{ @Overide publicvoidsayColor(){ System.out.println("Hi,I'mWhite!"); } }

抽象工厂角色

//抽象工厂类 publicabstractclassShapeFactory{ publicabstractShapecreateShape(); publicabstractColorcreateColor(); }

具体工厂角色

//红色的圆 publicclassRedCircleFactoryextendsShapeFactory{ @Overide publicShapecreateShape(){ returnnewCircle(); } @Overide publicColorcreateColor(){ returnnewRed(); } } //白色的圆 publicclassWhiteCircleFactoryextendsShapeFactory{ @Overide publicShapecreateShape(){ returnnewCircle(); } @Overide publicColorcreateColor(){ returnnewWhite(); } }

测试用例

publicclassClientCmd{ publicstaticvoidmain(String[]args){ //红色的圆 ShapeFactoryfactory=newRedCircleFactory(); factory.createShape().sayShape(); factory.createColor().sayShapeColor(); //白色的圆 ShapeFactoryfactory=newWhiteCircleFactory(); factory.createShape().sayShape(); factory.createColor().sayShapeColor(); } }

,