• 设计模式总结-抽象工厂模式


    模式动机

    工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法。但是有时候我们需要一个工厂可以提供多个产品对象,而不是单一的产品对象。

    为了更清晰地理解工厂方法模式,需要先引入两个概念:

    • 产品等级结构:

    产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。

    • 产品族:

    在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中。

    在这里插入图片描述
    模式动机
    当系统所提供的工厂所需生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构中属于不同类型的具体产品时需要使用抽象工厂模式。
    抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形态。
    抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建 。当一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象时,抽象工厂模式比工厂方法模式更为简单、有效率。

    在这里插入图片描述

    模式定义

    抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。

    模式结构

    在这里插入图片描述

    抽象工厂模式包含如下角色:

    • AbstractFactory:抽象工厂
    • ConcreteFactory:具体工厂
    • AbstractProduct:抽象产品
    • Product:具体产品

    模式分析

    假如我们现在有两类产品 button 、text,button为按钮类,text为输入文本类。
    两类产品又具体在不同的操作系统有不同的具体实现。
    在这里插入图片描述
    我们将其按产品等级和产品族做一下划分
    在这里插入图片描述
    根据抽象工厂模式下的具体实现如下:
    在这里插入图片描述

    模式实例与解析

    实例一:电器工厂

    一个电器工厂可以产生多种类型的电器,如海尔工厂可以生产海尔电视机、海尔空调等,TCL工厂可以生产TCL电视机、TCL空调等,相同品牌的电器构成一个产品族,而相同类型的电器构成了一个产品等级结构,现使用抽象工厂模式模拟该场景。
    在这里插入图片描述

    
    <config>
    	<className>TCLFactoryclassName>
    config>
    
    • 1
    • 2
    • 3
    • 4
    public interface Television
    {
    	public void play();
    }
    
    public class HaierTelevision implements Television
    {
    	public void play()
    	{
    		System.out.println("HaierTelevision......");
    	}
    }
    
    public class TCLTelevision implements Television
    {
    	public void play()
    	{
    		System.out.println("TCLTelevision......");
    	}
    }
    
    
    public interface AirConditioner
    {
    	public void changeTemperature();
    }
    
    public class HairAirConditioner implements AirConditioner
    {
    	public void changeTemperature()
    	{
    		System.out.println("HairAirConditioner......");
    	}
    }
    
    public class TCLAirConditioner implements AirConditioner
    {
    	public void changeTemperature()
    	{
    		System.out.println("TCLAirConditioner......");
    	}
    }
    
    public interface EFactory
    {
    	public Television produceTelevision();
    	public AirConditioner produceAirConditioner();
    }
    
    public class HaierFactory implements EFactory
    {
    	public Television produceTelevision()
    	{
    		return new HaierTelevision();
    	}
    	
    	public AirConditioner produceAirConditioner()
    	{
    		return new HairAirConditioner();
    	}
    }
    
    public class TCLFactory implements EFactory
    {
    	public Television produceTelevision()
    	{
    		return new TCLTelevision();
    	}
    	
    	public AirConditioner produceAirConditioner()
    	{
    		return new TCLAirConditioner();
    	}
    }
    
    public class Client
    {
    	public static void main(String args[])
    	{
             try
             {
             	EFactory factory;
             	Television tv;
             	AirConditioner ac;
             	factory=(EFactory)XMLUtil.getBean();
             	tv=factory.produceTelevision();
             	tv.play();
             	ac=factory.produceAirConditioner();
             	ac.changeTemperature();
             }
             catch(Exception e)
             {
             	System.out.println(e.getMessage());
             }
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    import javax.xml.parsers.*;
    import org.w3c.dom.*;
    import org.xml.sax.SAXException;
    import java.io.*;
    public class XMLUtil
    {
     
    	public static Object getBean()
    	{
    		try
    		{
    			//�����ĵ�����
    			DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
    			DocumentBuilder builder = dFactory.newDocumentBuilder();
    			Document doc;							
    			doc = builder.parse(new File("config.xml")); 
    		
    			//��ȡ�����������ı��ڵ�
    			NodeList nl = doc.getElementsByTagName("className");
                Node classNode=nl.item(0).getFirstChild();
                String cName=classNode.getNodeValue();
                
                //ͨ����������ʵ�����󲢽��䷵��
                Class c=Class.forName(cName);
    	  	    Object obj=c.newInstance();
                return obj;
               }   
               	catch(Exception e)
               	{
               		e.printStackTrace();
               		return null;
               	}
    		}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
  • 相关阅读:
    leetcode热题HOT 238. 除自身以外数组的乘积
    Python Subprocess介绍:基础和示例
    C++ 数据结构 哈弗曼树的制作
    java计算机毕业设计妇女健康保健系统源码+mysql数据库+系统+lw文档+部署
    汇编B800显示字符和颜色
    【德哥说库系列】-Oracle 19C PDB创建大全
    洛谷题解 | P1051 谁拿了最多奖学金
    本地虚拟机centos7通过docker安装主从mysql5.7.21
    05_Bootstrap插件02
    比 JSON.stringify 快两倍的fast-json-stringify
  • 原文地址:https://blog.csdn.net/weixin_42439274/article/details/137397174