工厂模式
工厂模式(Factory Pattern)提供了一种创建对象的方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展和维护性。
1、简单工厂模式
简单工厂模式又叫静态工厂模式,是最简单实用的一种工厂模式,在一定程度上不符合设计原则(因为新增一个类时需要修改工厂逻辑,违反开闭原则)但是简单实用,新增功能总是要改代码的吧
UML:

Cast1:
Router抽象类(或接口)
1 public abstract class Router { 2 abstract void showName(); 3 }
华为Router:
public class HUAWEIRouter extends Router { @Override void showName() { System.out.println("HUAWEIRouter::showName()"); } }
思科Router:
public class CiscoRouter extends Router { @Override void showName() { System.out.println("CiscoRouter::showName()"); } }
工厂类:
1 public class RouterFactory { 2 public static Router getRouter(String routerType) { 3 if(routerType.equalsIgnoreCase("HUAWEI")) { 4 return new HUAWEIRouter(); 5 } 6 if(routerType.equalsIgnoreCase("cisco")) { 7 return new CiscoRouter(); 8 } 9 return null; 10 } 11 }
客户端:
1 public class Main { 2 public static void main(String[] args) { 3 Router HUAWEIRouter = RouterFactory.getRouter("HUAWEI"); 4 Router ciscoRouter = RouterFactory.getRouter("cisco"); 5 6 HUAWEIRouter.showName(); 7 ciscoRouter.showName(); 8 } 9 }
2、工厂方法模式
工厂方法模式是简单工厂模式的延伸,将生成具体产品的任务交给具体工厂,在不修改已有类的前提下,通过新增类实现扩展,符合了开闭原则,但是在新增产品时,类的数量将成对增加。
UML:

Cast2:
Router 抽象类、实现类同Cast1
抽象工厂:
1 public abstract class AbstractFactory { 2 abstract Router getInstance(); 3 }
HUAWEI工厂:
1 public class HUAWEIFactory extends AbstractFactory { 2 @Override 3 Router getRouter() { 4 return new HUAWEIRouter(); 5 } 6 }
Cisco工厂:
1 public class CiscoFactory extends AbstractFactory { 2 @Override 3 Router getRouter() { 4 return new CiscoRouter(); 5 } 6 }
客户端:
1 public class Main { 2 public static void main(String[] args) { 3 AbstractFactory huaweiFactory = new HUAWEIFactory(); 4 AbstractFactory ciscoFactory = new CiscoFactory(); 5 6 Router HUAWEIRouter = huaweiFactory.getRouter(); 7 HUAWEIRouter.showName(); 8 9 Router ciscoRouter = ciscoFactory.getRouter(); 10 ciscoRouter.showName(); 11 // 新增锐捷路由器需要添加锐捷路由器、锐捷工厂, 而不用改之前的代码 12 // AbstractFactory routerFactory = new RuijieFactory(); 13 // Router ruijieRouter = routerFactory.getRouter(); 14 // ruijieRouter.showName(); 15 } 16 }
3、抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。抽象工厂模式是工厂方法模式的升级版,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。
优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:产品族扩展非常困难(但是产品等级易扩展),要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
(产品族即一个系列的产品,如华为的路由器、交换机、服务器等为一个产品族;产品等级即不同系列的相同产品如华为的路由器、思科的路由器、锐捷的路由器为一个产品等级)
UML:

Cast3:各个产商除了生成交换机,还生产路由器
增加交换机抽象类:
1 public abstract class Switch { 2 abstract void showName(); 3 }
华为Switch:
1 public class HUAWEISwitch extends Switch { 2 @Override 3 void showName() { 4 System.out.println("HUAWEISwitch::showName()"); 5 } 6 }
思科Switch:
1 public class CiscoSwitch extends Switch { 2 @Override 3 void showName() { 4 System.out.println("CiscoSwitch::showName()"); 5 } 6 }
抽象工厂增加生产交换机抽象方法(或接口)
1 public abstract class AbstractFactory { 2 abstract Router getRouter(); 3 abstract Switch getSwitch(); 4 }
华为工厂增加交换机制造方法:
1 public class HUAWEIFactory extends AbstractFactory { 2 @Override 3 Router getRouter() { 4 return new HUAWEIRouter(); 5 } 6 7 @Override 8 Switch getSwitch() { 9 return new HUAWEISwitch(); 10 } 11 }
思科工厂增加交换机制作方法:
1 public class CiscoFactory extends AbstractFactory { 2 @Override 3 Router getRouter() { 4 return new CiscoRouter(); 5 } 6 7 @Override 8 Switch getSwitch() { 9 return new CiscoSwitch(); 10 } 11 }
客户端:
1 public class Main { 2 public static void main(String[] args) { 3 AbstractFactory huaweiFactory = new HUAWEIFactory(); 4 Router huaweiRouter = huaweiFactory.getRouter(); 5 Switch huaweiSwitch = huaweiFactory.getSwitch(); 6 huaweiRouter.showName(); 7 huaweiSwitch.showName(); 8 9 AbstractFactory ciscoFactory = new CiscoFactory(); 10 Router ciscoRouter = ciscoFactory.getRouter(); 11 Switch ciscoSwitch = ciscoFactory.getSwitch(); 12 ciscoRouter.showName(); 13 ciscoSwitch.showName(); 14 } 15 }
总结:
简单工厂模式:工厂类负责所有产品对象的创建,增加了工厂类的职责,且使用了静态方法创建,导致无法被继承。优点在于实现简单且实用,适用于对象较少或简单的情况。
工厂方法模式:一个具体工厂类负责创建一个产品,如果增加新产品,只需要增加一个具体的产品工厂类和产品类即可,不会影响其他代码,符合开闭原则,增加了扩展性和可维护性。但是无法体现产品之间的联系。
抽象工厂模式:一个具体工厂类负责创建一个产品族,使得客户端的调用变得简单;如果要更换厂家,只需要更换一个工厂类即可,但是产品族的扩展比较困难。
三种工厂模式没有优劣之分,在实际应用中应根据具体场景和项目需求进行选择。

浙公网安备 33010602011771号