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

    在这里插入图片描述

    上一篇:工厂模式

    1.什么是抽象工厂模式?

      在上一篇文章中我们也说到,抽象工厂模式可以说是一个超级工厂,可以通过超级工厂来创建其他的工厂。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,无需指定他们具体的类,每个生成的工厂都可以按照工厂模式来创建对象。

    1.什么时候使用抽象工厂模式?

      系统的产品有多个产品族,而我们只需要消费其中某一个产品族中的产品。什么是产品族?

    以手机为例:

    在这里插入图片描述

    3.如何实现抽象工厂模式?

    1)定义手机接口
    /**
     * 定义 手机 接口
     */
    public interface Phone {
    	
    	//定义手机功能
    	/**
    	 * 开机
    	 */
    	void boot();
    	/**
    	 * 关机
    	 */
    	void shutdown();
    	/**
    	 * 发短信
    	 */
    	void sendMessage();
    	
    }
    
    
    2)定义路由器接口
    /**
     * 定义 路由器 接口
     */
    public interface Router {
    
    	//定义路由器功能
    
    	/**
    	 * 开机
    	 */
    	void boot();
    	/**
    	 * 关机
    	 */
    	void shutdown();
    	/**
    	 * 打开wifi
    	 */
    	void openwifi();
    }
    
    3)定义小米手机类

    此类是小米手机的具体实现

    /**
     * 定义小米手机类
     */
    public class XiaomiPhone implements Phone {
    
    	@Override
    	public void boot() {
    		System.out.println("开启小米手机");
    	}
    
    	@Override
    	public void shutdown() {
    		System.out.println("小米手机关机");
    	}
    
    	@Override
    	public void sendMessage() {
    		System.out.println("小米手机发送短信");
    	}
    }
    
    
    4)定义小米路由器

    此类是小米路由器具体实现类。

    /**
     * 定义小米路由器类
     */
    public class XiaomiRouter implements Router {
    
    	@Override
    	public void boot() {
    		System.out.println("开启小米路由器");
    	}
    
    	@Override
    	public void shutdown() {
    		System.out.println("关闭小米路由器");
    	}
    
    	@Override
    	public void openwifi() {
    		System.out.println("小米路由器打开wifi");
    	}
    }
    
    
    5)定义华为手机类

    此类是华为手机的具体实现类

    /**
     * 定义华为手机类
     */
    public class HuaweiPhone implements Phone {
    
    	@Override
    	public void boot() {
    		System.out.println("开启华为手机");
    	}
    
    	@Override
    	public void shutdown() {
    		System.out.println("华为手机关机");
    	}
    
    	@Override
    	public void sendMessage() {
    		System.out.println("华为手机发送短信");
    	}
    }
    
    6)定义华为路由器类

    此类是华为路由器的具体实现类

    /**
     * 定义华为路由器类
     */
    public class HuaweiRouter implements Router {
    
    	@Override
    	public void boot() {
    		System.out.println("开启华为路由器");
    	}
    
    	@Override
    	public void shutdown() {
    		System.out.println("关闭华为路由器");
    	}
    
    	@Override
    	public void openwifi() {
    		System.out.println("华为路由器打开wifi");
    	}
    }
    
    7)定义抽象工厂类
    /**
     * 定义 抽象 工厂类
     */
    public interface AbstractFactory {
    
    	/**
    	 * 生产手机
    	 */
    	Phone productPhone();
    
    	/**
    	 * 生产路由器
    	 */
    	Router productRouter();
    
    }
    
    8)定义小米工厂
    /**
     * 定义小米工厂
     */
    public class XiaomiFactory implements AbstractFactory {
    
    	@Override
    	public Phone productPhone() {
    		return new XiaomiPhone();
    	}
    
    	@Override
    	public Router productRouter() {
    		return new XiaomiRouter();
    	}
    }
    
    9)定义华为工厂
    /**
     * 定义华为工厂
     */
    public class HuaweiFactory implements AbstractFactory {
    
    	@Override
    	public Phone productPhone() {
    		return new HuaweiPhone();
    	}
    
    	@Override
    	public Router productRouter() {
    		return new HuaweiRouter();
    	}
    }
    
    
    10)编写测试类
    /**
     * 测试类
     */
    public class Test {
    
    	public static void main(String[] args) {
    		//创建一个小米工厂
    		XiaomiFactory xiaomiFactory = new XiaomiFactory();
    		//小米工厂生产小米手机,获取小米手机对象
    		Phone phone = xiaomiFactory.productPhone();
    		//使用小米手机功能
    		phone.boot();
    		phone.sendMessage();
    		phone.shutdown();
    
    		/**
    		 * 华为操作如上……
    		 */
    
    	}
    }
    
    11)运行结果

    在这里插入图片描述

    4.抽象工厂模式优缺点?

    1)优点:

    1.当一个产品族(小米、华为)被设计成一起工作时,此模式能够保证始终只使用其一种产品。
    2.在使用的时候我们不需要去关心它实现的细节,直接找工厂拿就行。

    2)缺点:

    1.在工厂中就已经规定了生产哪些产品,扩展生产种类麻烦(如小米生产家电,那就需要修改工厂代码)
    2.工厂模式本来挺easy的,但是这种模式更加抽象更加不容易搞懂。

    下一篇:建造者模式

  • 相关阅读:
    前端React 条件渲染
    hbuilder小白干货之快捷键大全
    前端React 元素渲染
    mybatis学习笔记五(映射)
    mybatis学习笔记四(配置文件)
    mybatis学习笔记二(sqlsession与开发dao)
    mybatis学习笔记三(动态sql)
    mybatis学习笔记一(mybatis概述)
    必备idea 插件plugins 提高编码效率
    shell提升篇
  • 原文地址:https://www.cnblogs.com/wgty/p/12810437.html
Copyright © 2011-2022 走看看