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

  • 相关阅读:
    [Swift]LeetCode895. 最大频率栈 | Maximum Frequency Stack
    [Swift]LeetCode894. 所有可能的满二叉树 | All Possible Full Binary Trees
    [Swift]LeetCode893. 特殊等价字符串组 | Groups of Special-Equivalent Strings
    [Swift]LeetCode892. 三维形体的表面积 | Surface Area of 3D Shapes
    [Swift]LeetCode891. 子序列宽度之和 | Sum of Subsequence Widths
    [Swift]LeetCode890. 查找和替换模式 | Find and Replace Pattern
    find missing conjunction, why?
    sh 脚本报错
    What's mean ORA-25191?
    饼状图
  • 原文地址:https://www.cnblogs.com/oukele/p/10105005.html
Copyright © 2011-2022 走看看