zoukankan      html  css  js  c++  java
  • Java 抽象工厂模式

    抽象工厂

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

    为了能更好理解抽象工厂模式,举个例子:

    手机有小米手机、华为手机、苹果手机....,这些具体的手机和抽象手机就构成了一个产品等级结构。

    同样的,路由器有小米路由器,华为路由器,这些具体的路由器和抽象路由器就构成了另一个产品等级结构,实质

    产品等级结构即产品的继承结构(相当于实现了同一个接口的实现类)。小米手机位于手机产品等级结构中,小米路由器位于路由器的产品等级结构中

    ,而小米手机和小米路由器都是小米公司生产的,这样就构成了一个产品族,同理华为手机和华为路由器也构成了一个产品族。

    重点:产品族中的产品都是由同一个工厂生产的,位于不同的产品等级结构。

    抽象工厂是针对产品族。

    优点:

      1、无需关心创建的细节

      2、将一个系列的产品统一到一起创建

    示例:

     定义手机产品接口

    public interface Phone {//定义手机产品接口
    
        void start();//开机
        void close();//关机
        void sendOut();//发送信息
    
    }

      定义路由器产品接口

    public interface Router {//定义路由器产品的接口
        void start();//开机
        void close();//关机
        void wifi();//开启wifi
    }

      定义小米手机和小米路由器的产品实现类。

    public class XiaomiPhone implements Phone {// 手机产品接口的实现类  小米手机
        @Override
        public void start() {
            System.out.println("开启小米手机");
        }
    
        @Override
        public void close() {
            System.out.println("关闭小米手机");
        }
    
        @Override
        public void sendOut() {
            System.out.println("使用小米手机发短信");
        }
    }
    public class XiaomiRouter implements Router {// 路由器产品接口的实现类  小米路由器
        @Override
        public void start() {
            System.out.println("开启小米路由器");
        }
    
        @Override
        public void close() {
            System.out.println("开闭小米路由器");
        }
    
        @Override
        public void wifi() {
            System.out.println("打开小米路由器的wifi功能");
        }
    
    }

      定义华为手机和华为路由器的产品实现类。

    public class HuaweiPhone implements Phone {// 手机产品接口的实现类  华为手机
        @Override
        public void start() {
            System.out.println("开启华为手机");
        }
    
        @Override
        public void close() {
            System.out.println("关闭华为手机");
        }
    
        @Override
        public void sendOut() {
            System.out.println("使用华为手机发短信");
        }
    }
    public class HuaweiRouter implements Router { // 路由产品接口的实现类  华为路由器
        @Override
        public void start() {
            System.out.println("开启华为路由器");
        }
    
        @Override
        public void close() {
            System.out.println("开闭华为路由器");
        }
    
        @Override
        public void wifi() {
            System.out.println("打开华为路由器的wifi功能");
        }
    }

      定义一个抽象工厂接口。(抽象产品族工厂)

    public interface ProductFactory {//抽象产品工厂接口
    
        /**
         * 生产手机
         * */
        Phone productPhone();
    
        /**
         * 生产路由器
         * */
        Router productRouter();
    
    }

      小米工厂和华为工厂实现类

    public class XiaomiFactory implements ProductFactory {// 抽象工厂接口的实现类 -->  小米工厂类
        @Override
        public Phone productPhone() {
            System.out.println("-----------------------生产小米手机-----------------------");
            return new XiaomiPhone();
        }
    
        @Override
        public Router productRouter() {
            System.out.println("-----------------------生产小米路由器-----------------------");
            return new XiaomiRouter();
        }
    }
    public class HuaweiFactory implements ProductFactory {// 抽象工厂接口的实现类 -->  华为工厂类
        @Override
        public Phone productPhone() {
            System.out.println("-----------------------生产华为手机-----------------------");
            return new HuaweiPhone();
        }
    
        @Override
        public Router productRouter() {
            System.out.println("-----------------------生产华为路由器-----------------------");
            return new HuaweiRouter();
        }
    }

    客户端:

    public class Test {
    
        public static void main(String[] args) {
            System.out.println("=========================小米系列产品=========================");
            //小米工厂实例
            ProductFactory xiaofactory = new XiaomiFactory();
            //小米手机
            Phone xiaoPhone = xiaofactory.productPhone();
            xiaoPhone.start();
            xiaoPhone.sendOut();
            xiaoPhone.close();
            //小米路由器
            Router xiaoRouter = xiaofactory.productRouter();
            xiaoRouter.start();
            xiaoRouter.wifi();
            xiaoRouter.close();
    
            System.out.println();
            System.out.println();
            System.out.println();
    
    
            System.out.println("=========================华为系列产品=========================");
            //华为工厂实例
            ProductFactory huaweifactory = new HuaweiFactory();
            //华为手机
            Phone huaweiPhone = huaweifactory.productPhone();
            huaweiPhone.start();
            huaweiPhone.sendOut();
            huaweiPhone.close();
            //华为路由器
            Router huaweiRouter= huaweifactory.productRouter();
            huaweiRouter.start();
            huaweiRouter.wifi();
            huaweiRouter.close();
    
        }
    }

    结果:

     1 =========================小米系列产品=========================
     2 -----------------------生产小米手机-----------------------
     3 开启小米手机
     4 使用小米手机发短信
     5 关闭小米手机
     6 -----------------------生产小米路由器-----------------------
     7 开启小米路由器
     8 打开小米路由器的wifi功能
     9 开闭小米路由器
    10 
    11 
    12 
    13 =========================华为系列产品=========================
    14 -----------------------生产华为手机-----------------------
    15 开启华为手机
    16 使用华为手机发短信
    17 关闭华为手机
    18 -----------------------生产华为路由器-----------------------
    19 开启华为路由器
    20 打开华为路由器的wifi功能
    21 开闭华为路由器

    抽象工厂模式的缺点:

      1、规定了所有可能被创建的产品集合,产品族中扩展新的产品困难

      2、增加了系统的抽象性和理解难度

    代码示例地址:https://github.com/oukele/abstractFactory

  • 相关阅读:
    使用 ASP.NET Core MVC 创建 Web API(五)
    使用 ASP.NET Core MVC 创建 Web API(四)
    使用 ASP.NET Core MVC 创建 Web API(三)
    使用 ASP.NET Core MVC 创建 Web API(二)
    使用 ASP.NET Core MVC 创建 Web API(一)
    学习ASP.NET Core Razor 编程系列十九——分页
    学习ASP.NET Core Razor 编程系列十八——并发解决方案
    一个屌丝程序猿的人生(九十八)
    一个屌丝程序猿的人生(九十七)
    一个屌丝程序猿的人生(九十五)
  • 原文地址:https://www.cnblogs.com/oukele/p/10105005.html
Copyright © 2011-2022 走看看