设计模式(三)-抽象工厂模式

1、定义:抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无法指定它们具体的类。

2、适用场景:

  • 客户端(应用层)不依赖于产品类实例如何被创建;
  • 强调一个系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量的重复代码;
  • 提供一个产品类的库,所有的产品以同样的接口出现,从而使得客户端不依赖于具体的实现。

3、优点:

  • 具体产品在应用层的代码隔离,无需关心创建的细节;
  • 将一个系列的产品统一到一起创建。

4、缺点:

  • 规定了所有可能被创建的产品集合,产品族中扩展新的产品困难;
  • 增加了系统的抽象性和理解难度。

5、类图:

6、代码例子

 1 /**
 2  * 手机产品接口
 3  */
 4 public interface IphoneProduct {
 5 
 6     void start();
 7     void shutdown();
 8     void callup();
 9     void sendSMS();
10 }
 1 /**
 2  * 华为手机
 3  */
 4 public class HuaweiPhone implements IphoneProduct {
 5     @Override
 6     public void start() {
 7         System.out.println("开启华为手机");
 8     }
 9 
10     @Override
11     public void shutdown() {
12         System.out.println("关闭华为手机");
13     }
14 
15     @Override
16     public void callup() {
17         System.out.println("华为打电话");
18     }
19 
20     @Override
21     public void sendSMS() {
22         System.out.println("华为发短信");
23     }
24 }
 1 /**
 2  * 小米手机
 3  */
 4 public class XiaomiPhone implements IphoneProduct {
 5     @Override
 6     public void start() {
 7         System.out.println("开启小米手机");
 8     }
 9 
10     @Override
11     public void shutdown() {
12         System.out.println("关闭小米手机");
13     }
14 
15     @Override
16     public void callup() {
17         System.out.println("小米打电话");
18     }
19 
20     @Override
21     public void sendSMS() {
22         System.out.println("小米发短信");
23     }
24 }
 1 /**
 2  * 路由器产品接口
 3  */
 4 public interface IRouterProduct {
 5 
 6     void start();
 7     void shutdown();
 8     void openWife();
 9     void setting();
10 }
 1 /**
 2  * 华为路由器
 3  */
 4 public class HuaweiRouter implements IRouterProduct {
 5     @Override
 6     public void start() {
 7         System.out.println("启动华为路由器");
 8     }
 9 
10     @Override
11     public void shutdown() {
12         System.out.println("关闭华为路由器");
13     }
14 
15     @Override
16     public void openWife() {
17         System.out.println("开启华为wife");
18     }
19 
20     @Override
21     public void setting() {
22         System.out.println("设置华为路由器");
23     }
24 }
 1 /**
 2  * 小米路由器
 3  */
 4 public class XiaomiRouter implements IRouterProduct {
 5     @Override
 6     public void start() {
 7         System.out.println("启动小米路由器");
 8     }
 9 
10     @Override
11     public void shutdown() {
12         System.out.println("关闭小米路由器");
13     }
14 
15     @Override
16     public void openWife() {
17         System.out.println("开启小米wife");
18     }
19 
20     @Override
21     public void setting() {
22         System.out.println("设置小米路由器");
23     }
24 }
 1 /**
 2  * 抽象产品工厂
 3  */
 4 public interface IProductFactory {
 5     //生产手机
 6     IphoneProduct iphoneProduct();
 7 
 8     //生产路由器
 9     IRouterProduct routerProduct();
10 
11 
12 }
 1 /**
 2  * 华为工厂
 3  */
 4 public class HuaweiFactory implements IProductFactory {
 5     @Override
 6     public IphoneProduct iphoneProduct() {
 7         return new HuaweiPhone();
 8     }
 9 
10     @Override
11     public IRouterProduct routerProduct() {
12         return new HuaweiRouter();
13     }
14 }
 1 /**
 2  * 华为工厂
 3  */
 4 public class XiaomiFactory implements IProductFactory {
 5     @Override
 6     public IphoneProduct iphoneProduct() {
 7         return new XiaomiPhone();
 8     }
 9 
10     @Override
11     public IRouterProduct routerProduct() {
12         return new XiaomiRouter();
13     }
14 }

测试类如下:

 1 public class Client {
 2     public static void main(String[] args) {
 3         System.out.println("============小米系列产品====================");
 4         //小米工厂
 5         XiaomiFactory xiaomiFactory = new XiaomiFactory();
 6         IphoneProduct xiaomiPhone = xiaomiFactory.iphoneProduct();
 7         xiaomiPhone.start();
 8         xiaomiPhone.shutdown();
 9         xiaomiPhone.callup();
10         xiaomiPhone.sendSMS();
11 
12         IRouterProduct xiaomiRouter = xiaomiFactory.routerProduct();
13         xiaomiRouter.start();
14         xiaomiRouter.setting();
15         xiaomiRouter.openWife();
16         xiaomiRouter.setting();
17 
18         System.out.println("============华为系列产品====================");
19         //华为工厂
20         HuaweiFactory huaweiFactory = new HuaweiFactory();
21         IphoneProduct huaweiPhone = huaweiFactory.iphoneProduct();
22         huaweiPhone.start();
23         huaweiPhone.shutdown();
24         huaweiPhone.callup();
25         huaweiPhone.sendSMS();
26 
27         IRouterProduct huaweiRouter = huaweiFactory.routerProduct();
28         huaweiRouter.start();
29         huaweiRouter.setting();
30         huaweiRouter.openWife();
31         huaweiRouter.setting();
32 
33     }
34 }

7、小结

  • 简单工厂模式(静态工厂模式):虽然某种程度上不符合设计原则,但是实际使用最多;
  • 工厂方法模式:不修改已有类的前提下,通过增加新的工厂类实现扩展;
  • 抽象工厂模式:不可以增加产品,可以增加产品族。

8、应用场景

  • JDK中Calendar的getInstance方法;
  • 反射中Class对象的newInstance方法;
  • JDBC中的Connection对象的获取;
  • Spring中IOC容器创建管理bean对象。
如本文有侵权行为,请及时与本人联系,多多包涵! 小生初出茅庐,多多指教!

本文来自博客园,作者:it-小林,转载请注明原文链接:https://www.cnblogs.com/linruitao/p/14978758.html

原文地址:https://www.cnblogs.com/linruitao/p/14978758.html