zoukankan      html  css  js  c++  java
  • 设计模式(三)-抽象工厂模式

    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

  • 相关阅读:
    移动Web开发规范概述
    hibernate 多对多
    hibernate 1 对1
    hibernate 双向1对多
    Hibernate 单项多对1
    Hibernate Session 4种对象状态
    Hibernate Session缓存
    Hibernaate 详解
    Hibernate学习 (一)
    Struts拦截器Interceptor
  • 原文地址:https://www.cnblogs.com/linruitao/p/14978758.html
Copyright © 2011-2022 走看看