抽象工厂模式(JAVA反射)
实例代码(JAVA):模式动机
模式定义
模式结构
模式分析
抽象工厂类的典型代码如下:
1 public abstract class AbstractFactory 2 { 3 public abstract AbstractProductA createProductA(); 4 public abstract AbstractProductB createProductB(); 5 }
具体工厂类的典型代码如下:
1 public class ConcreteFactory1 extends AbstractFactory 2 { 3 public AbstractProductA createProductA() 4 { 5 return new ConcreteProductA1(); 6 } 7 public AbstractProductB createProductB() 8 { 9 return new ConcreteProductB1(); 10 } 11 }
模式实例与解析
实例代码(JAVA):
1 //抽象产品 Television 2 public interface Television 3 { 4 public void play(); 5 } 6 7 //具体产品 HaierTelevision 8 public class HaierTelevision implements Television 9 { 10 public void play() 11 { 12 System.out.println("海尔电视机播放中......"); 13 } 14 } 15 16 //具体产品 TCLTelevision 17 public class TCLTelevision implements Television 18 { 19 public void play() 20 { 21 System.out.println("TCL电视机播放中......"); 22 } 23 } 24 25 //抽象产品 AirConditioner 26 public interface AirConditioner 27 { 28 public void changeTemperature(); 29 } 30 31 //具体产品 HaierAirConditioner 32 public class HaierAirConditioner implements AirConditioner 33 { 34 public void changeTemperature() 35 { 36 System.out.println("海尔空调温度改变中......"); 37 } 38 } 39 40 //具体产品 TCLAirConditioner 41 public class TCLAirConditioner implements AirConditioner 42 { 43 public void changeTemperature() 44 { 45 System.out.println("TCL空调温度改变中......"); 46 } 47 } 48 49 //抽象工厂 EFactory 50 public interface EFactory 51 { 52 public Television produceTelevision(); 53 public AirConditioner produceAirConditioner(); 54 } 55 56 //具体工厂 HaierFactory 57 public class HaierFactory implements EFactory 58 { 59 public Television produceTelevision() 60 { 61 return new HaierTelevision(); 62 } 63 64 public AirConditioner produceAirConditioner() 65 { 66 return new HaierAirConditioner(); 67 } 68 } 69 70 //具体工厂 TCLFactory 71 public class TCLFactory implements EFactory 72 { 73 public Television produceTelevision() 74 { 75 return new TCLTelevision(); 76 } 77 78 public AirConditioner produceAirConditioner() 79 { 80 return new TCLAirConditioner(); 81 } 82 } 83 84 //配置文件 config.xml 85 <?xml version="1.0"?> 86 <config> 87 <className>HaierFactory</className> 88 </config> 89 90 //通过反射获得具体工厂的实例 XMLUtil 91 import javax.xml.parsers.*; 92 import org.w3c.dom.*; 93 import org.xml.sax.SAXException; 94 import java.io.*; 95 public class XMLUtil 96 { 97 //该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象 98 public static Object getBean() 99 { 100 try 101 { 102 //创建文档对象 103 DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance(); 104 DocumentBuilder builder = dFactory.newDocumentBuilder(); 105 Document doc; 106 doc = builder.parse(new File("config.xml")); 107 108 //获取包含类名的文本节点 109 NodeList nl = doc.getElementsByTagName("className"); 110 Node classNode=nl.item(0).getFirstChild(); 111 String cName=classNode.getNodeValue(); 112 113 //通过类名生成实例对象并将其返回 114 Class c=Class.forName(cName); 115 Object obj=c.newInstance(); 116 return obj; 117 } 118 catch(Exception e) 119 { 120 e.printStackTrace(); 121 return null; 122 } 123 } 124 } 125 126 //客户端类 Client 127 public class Client 128 { 129 public static void main(String args[]) 130 { 131 try 132 { 133 EFactory factory; 134 Television tv; 135 AirConditioner ac; 136 factory=(EFactory)XMLUtil.getBean(); 137 tv=factory.produceTelevision(); 138 tv.play(); 139 ac=factory.produceAirConditioner(); 140 ac.changeTemperature(); 141 } 142 catch(Exception e) 143 { 144 System.out.println(e.getMessage()); 145 } 146 } 147 }
实例代码(C++):
1 // 抽象工厂模式 2 #include <iostream> 3 using namespace std; 4 5 //抽象产品类 Television 6 class Television 7 { 8 public: 9 virtual void play() = 0; 10 }; 11 12 //具体产品类 HaierTelevision 13 class HaierTelevision:public Television 14 { 15 public: 16 void play() override 17 { 18 cout << "海尔电视播放中..." << endl; 19 } 20 }; 21 22 //具体产品类 TCLTelevision 23 class TCLTelevision : public Television 24 { 25 public: 26 void play() override 27 { 28 cout << "TCL电视播放中..." << endl; 29 } 30 }; 31 32 //抽象产品 AirConditioner 33 class AirConditioner 34 { 35 public: 36 virtual void changeTemperature() = 0; 37 }; 38 39 //具体产品 HaierAirConditioner 40 class HaierAirConditioner : public AirConditioner 41 { 42 public: 43 void changeTemperature() override 44 { 45 cout << "海尔空调温度改变中..." << endl; 46 } 47 }; 48 49 //具体产品 TCLAirConditioner 50 class TCLAirConditioner : public AirConditioner 51 { 52 public: 53 void changeTemperature() override 54 { 55 cout << "TCL空调温度改变中..." << endl; 56 } 57 }; 58 59 //抽象工厂 EFactory 60 class EFactory 61 { 62 public: 63 virtual Television* productTelevision() = 0; 64 virtual AirConditioner* productAirConditioner() = 0; 65 }; 66 67 //具体工厂 HaierFactory 68 class HaierFactory : public EFactory 69 { 70 public: 71 Television* productTelevision() override 72 { 73 return new HaierTelevision(); 74 } 75 76 AirConditioner* productAirConditioner() override 77 { 78 return new HaierAirConditioner(); 79 } 80 }; 81 82 //具体工厂 TCLFactory 83 class TCLFactory : public EFactory 84 { 85 public: 86 Television* productTelevision() override 87 { 88 return new TCLTelevision(); 89 } 90 91 AirConditioner* productAirConditioner() override 92 { 93 return new TCLAirConditioner(); 94 } 95 }; 96 97 //客户端 98 int main() 99 { 100 EFactory* factory; 101 Television* tv; 102 AirConditioner* ac; 103 factory = new HaierFactory(); 104 tv = factory->productTelevision(); 105 tv->play(); 106 ac = factory->productAirConditioner(); 107 ac->changeTemperature(); 108 109 factory = new TCLFactory(); 110 tv = factory->productTelevision(); 111 tv->play(); 112 ac = factory->productAirConditioner(); 113 ac->changeTemperature(); 114 return 0; 115 }
模式优缺点
模式适用环境
模式应用
模式扩展
转载于:https://www.cnblogs.com/WindSun/p/10253248.html
抽象工厂模式(JAVA反射)相关推荐
- java 反射抽象_Java实现抽象工厂模式+java的反射的机制
Java的反射机制: JAVA反射机制是就是运行的状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法 ...
- C#设计模式之:抽象工厂模式与反射
抽象工厂模式[实例]: 定义一个用于创建对象的接口,让子类决定实例化哪一个类 UML 代码 class User { private int _id; public int Id { ...
- 简单工厂和 工厂设计模式--抽象工厂模式--Java实现
简单工厂不是23种设计模式 工厂方法·模式 :定义一个创建对象得接口,但是让实现这个接口的类来决定实例化哪一个类,工厂方法能使得类的实例化推迟到子类中进行 工厂方法缺点: 增加了类的数量,增加复杂度 ...
- 抽象工厂模式 java实例 tclhaier_Unity常用的设计模式_工厂模式系列之抽象工厂模式...
在工厂方法模式中,工厂只负责生产具体的产品,每一个具体的工厂对应着一个具体的产品,工厂方法也具有唯一性,如果有时候我们需要一个工厂方法提供多个产品而不是一个单一的产品,例如:海尔品牌不止生产海尔TV, ...
- java设计模式---抽象工厂模式
工厂模式在项目中是常常用到的,有人说只有大项目才会用到,小项目是体会不出来.其实使用设计模式与项目的大小没有实质性的联系.设计模式是经验的总结而不是衡量项目大小的标准. 以开发项目的DAO层为例,在项 ...
- 设计模式之工厂方法模式、抽象工厂模式的概念和实现及使用“反射技术+读取配置文件”的方法对工厂模式进行改进(软件工程综合实践课程第三周个人作业)
文章目录 一.实验目的 二.知识总结 1.工厂方法模式简介 2.抽象工厂模式简介 3.工厂模式小结 4.利用"反射技术+读取配置文件"的方法改进程序 三.实验内容 1. 工厂模式实 ...
- java 反射 工厂模式_Java反射机制demo(七)—反射机制与工厂模式
Java反射机制demo(七)-反射机制与工厂模式 工厂模式 简介 工厂模式是最常用的实例化对象模式. 工厂模式的主要作用就是使用工厂方法代替new操作. 为什么要使用工厂模式?直接new不好吗? 直 ...
- 设计模式之工厂类模式总结对比、简单工厂模式、工厂方法模式、抽象工厂模式、带反射的工厂模式、例子代码分析、最详细
1. 题目 假设某公司同时用SqlServer.MySql数据库,即会切换两数据库(不同数据库的sql语句有些许差异),同时,两数据库里均有对Users.Departments表的操作(sql代码不一 ...
- java不同工厂生产不同电器_完整案例分析再加知识整合——艾特抽象工厂模式,超详细的...
抽象工厂模式 模式动机与定义 模式动机 产品等级结构:产品等级结构即产品的继承结构,例如一个抽象类是电视机,其子类有海尔电视机.海信电视机.TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产 ...
最新文章
- Workbench Could not connect the SSH Tunnel Authentication error
- java学习总结:3
- 栈的应用——迷宫的非递归解法
- [密码学] 高级加密标准AES
- 虚拟机中的solaris无法通过putty连接(网络模式为桥接模式)
- 安装memcached服务和PECL关于memcache的两个PHP扩展
- 微软Azure storage account的path值代表什么含义
- c语言fin和fout用法,fin,fout提示第一次调用
- Docker服务安全加固
- 计算机主页为什么打不开怎么办,主页被限制,打不开怎么办?
- 新泽西理工计算机科学硕士,新泽西理工学院计算机科学专业硕士申请需要满足哪些条件?...
- 博士的一天(备受打击版本)
- 在报表开发工具Stimulsoft Report数据透视表的新功能介绍
- 数字平原搭建赛博朋克风城市夜景
- 二分插入排序法-Python版
- 男人冬季吃羊肉有哪些好处男人冬季吃羊肉有哪些好处
- CentOS6u9 Oracle11g RAC 搭建部署(八)OGG测试
- STC15W4K32S4单片机ADC应用实现
- 美团招聘不要黄泛区及东北人_吃瓜群众愤慨怒怼!
- 用ExcelVBA下载股票板块历史数据
热门文章
- Delphi的Socket编程要分几步?
- 实验五 编写、调试具有多个段的程序
- Java说明注释(Doc注释)
- npm ERR! cb.apply is not a function npm ERR! A complete log of this run can be found in: npm ERR!
- Python入门学习---第三天
- C++ 双向链表的建立与遍历
- android客户端证书到期了,在Android设备上生成客户端证书
- Java接口(interface)的概念及使用
- 说说PendingIntent的内部机制
- Android中Intent连接不同组件的原理