工厂模式

工厂模式(Factory Pattern)提供了一种创建对象的方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展和维护性。

1、简单工厂模式

简单工厂模式又叫静态工厂模式,是最简单实用的一种工厂模式,在一定程度上不符合设计原则(因为新增一个类时需要修改工厂逻辑,违反开闭原则)但是简单实用,新增功能总是要改代码的吧

UML: 

 Cast1:

Router抽象类(或接口)

1 public abstract class Router {
2     abstract void showName();
3 }
View Code

华为Router:

public class HUAWEIRouter extends Router {
    @Override
    void showName() {
        System.out.println("HUAWEIRouter::showName()");
    }
}
View Code

思科Router:

public class CiscoRouter extends Router {
    @Override
    void showName() {
        System.out.println("CiscoRouter::showName()");
    }
}
View Code

工厂类:

 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 }
View Code

客户端:

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 }
View Code

2、工厂方法模式

工厂方法模式是简单工厂模式的延伸,将生成具体产品的任务交给具体工厂,在不修改已有类的前提下,通过新增类实现扩展,符合了开闭原则,但是在新增产品时,类的数量将成对增加。

UML:

 Cast2:

Router 抽象类、实现类同Cast1

抽象工厂:

1 public abstract class AbstractFactory {
2        abstract Router getInstance();
3 }
View Code

HUAWEI工厂:

1 public class HUAWEIFactory extends AbstractFactory {
2     @Override
3     Router getRouter() {
4         return new HUAWEIRouter();
5     }
6 }
View Code

Cisco工厂:

1 public class CiscoFactory extends AbstractFactory {
2     @Override
3     Router getRouter() {
4         return new CiscoRouter();
5     }
6 }
View Code

客户端:

 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 }
View Code

3、抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。抽象工厂模式是工厂方法模式的升级版,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。

优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

缺点:产品族扩展非常困难(但是产品等级易扩展),要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

(产品族即一个系列的产品,如华为的路由器、交换机、服务器等为一个产品族;产品等级即不同系列的相同产品如华为的路由器、思科的路由器、锐捷的路由器为一个产品等级)

UML:

 Cast3:各个产商除了生成交换机,还生产路由器

增加交换机抽象类:

1 public abstract class Switch {
2     abstract void showName();
3 }
View Code

华为Switch:

1 public class HUAWEISwitch extends Switch {
2     @Override
3     void showName() {
4         System.out.println("HUAWEISwitch::showName()");
5     }
6 }
View Code

思科Switch:

1 public class CiscoSwitch extends Switch {
2     @Override
3     void showName() {
4         System.out.println("CiscoSwitch::showName()");
5     }
6 }
View Code

抽象工厂增加生产交换机抽象方法(或接口)

1 public abstract class AbstractFactory {
2        abstract Router getRouter();
3        abstract Switch getSwitch();
4 }
View Code

华为工厂增加交换机制造方法:

 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 }
View Code

思科工厂增加交换机制作方法:

 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 }
View Code

客户端:

 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 }
View Code

总结:

单工厂模式:工厂类负责所有产品对象的创建,增加了工厂类的职责,且使用了静态方法创建,导致无法被继承。优点在于实现简单且实用,适用于对象较少或简单的情况。

工厂方法模式:一个具体工厂类负责创建一个产品,如果增加新产品,只需要增加一个具体的产品工厂类和产品类即可,不会影响其他代码,符合开闭原则,增加了扩展性和可维护性。但是无法体现产品之间的联系。

抽象工厂模式:一个具体工厂类负责创建一个产品族,使得客户端的调用变得简单;如果要更换厂家,只需要更换一个工厂类即可,但是产品族的扩展比较困难。

三种工厂模式没有优劣之分,在实际应用中应根据具体场景和项目需求进行选择。

posted @ 2020-08-05 02:39  whyha  阅读(255)  评论(0)    收藏  举报