抽象工厂模式(JAVA反射)
实例代码(JAVA):模式动机
模式定义
模式结构
模式分析
抽象工厂类的典型代码如下:
public abstract class AbstractFactory
{
public abstract AbstractProductA createProductA();
public abstract AbstractProductB createProductB();
}
具体工厂类的典型代码如下:
public class ConcreteFactory1 extends AbstractFactory
{
public AbstractProductA createProductA()
{
return new ConcreteProductA1();
}
public AbstractProductB createProductB()
{
return new ConcreteProductB1();
}
}
模式实例与解析
实例代码(JAVA):
//抽象产品 Television
public interface Television
{
public void play();
} //具体产品 HaierTelevision
public class HaierTelevision implements Television
{
public void play()
{
System.out.println("海尔电视机播放中......");
}
} //具体产品 TCLTelevision
public class TCLTelevision implements Television
{
public void play()
{
System.out.println("TCL电视机播放中......");
}
} //抽象产品 AirConditioner
public interface AirConditioner
{
public void changeTemperature();
} //具体产品 HaierAirConditioner
public class HaierAirConditioner implements AirConditioner
{
public void changeTemperature()
{
System.out.println("海尔空调温度改变中......");
}
} //具体产品 TCLAirConditioner
public class TCLAirConditioner implements AirConditioner
{
public void changeTemperature()
{
System.out.println("TCL空调温度改变中......");
}
} //抽象工厂 EFactory
public interface EFactory
{
public Television produceTelevision();
public AirConditioner produceAirConditioner();
} //具体工厂 HaierFactory
public class HaierFactory implements EFactory
{
public Television produceTelevision()
{
return new HaierTelevision();
} public AirConditioner produceAirConditioner()
{
return new HaierAirConditioner();
}
} //具体工厂 TCLFactory
public class TCLFactory implements EFactory
{
public Television produceTelevision()
{
return new TCLTelevision();
} public AirConditioner produceAirConditioner()
{
return new TCLAirConditioner();
}
} //配置文件 config.xml
<?xml version="1.0"?>
<config>
<className>HaierFactory</className>
</config> //通过反射获得具体工厂的实例 XMLUtil
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import java.io.*;
public class XMLUtil
{
//该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象
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;
}
}
} //客户端类 Client
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());
}
}
}
实例代码(C++):
// 抽象工厂模式
#include <iostream>
using namespace std; //抽象产品类 Television
class Television
{
public:
virtual void play() = ;
}; //具体产品类 HaierTelevision
class HaierTelevision:public Television
{
public:
void play() override
{
cout << "海尔电视播放中..." << endl;
}
}; //具体产品类 TCLTelevision
class TCLTelevision : public Television
{
public:
void play() override
{
cout << "TCL电视播放中..." << endl;
}
}; //抽象产品 AirConditioner
class AirConditioner
{
public:
virtual void changeTemperature() = ;
}; //具体产品 HaierAirConditioner
class HaierAirConditioner : public AirConditioner
{
public:
void changeTemperature() override
{
cout << "海尔空调温度改变中..." << endl;
}
}; //具体产品 TCLAirConditioner
class TCLAirConditioner : public AirConditioner
{
public:
void changeTemperature() override
{
cout << "TCL空调温度改变中..." << endl;
}
}; //抽象工厂 EFactory
class EFactory
{
public:
virtual Television* productTelevision() = ;
virtual AirConditioner* productAirConditioner() = ;
}; //具体工厂 HaierFactory
class HaierFactory : public EFactory
{
public:
Television* productTelevision() override
{
return new HaierTelevision();
} AirConditioner* productAirConditioner() override
{
return new HaierAirConditioner();
}
}; //具体工厂 TCLFactory
class TCLFactory : public EFactory
{
public:
Television* productTelevision() override
{
return new TCLTelevision();
} AirConditioner* productAirConditioner() override
{
return new TCLAirConditioner();
}
}; //客户端
int main()
{
EFactory* factory;
Television* tv;
AirConditioner* ac;
factory = new HaierFactory();
tv = factory->productTelevision();
tv->play();
ac = factory->productAirConditioner();
ac->changeTemperature(); factory = new TCLFactory();
tv = factory->productTelevision();
tv->play();
ac = factory->productAirConditioner();
ac->changeTemperature();
return ;
}
模式优缺点
模式适用环境
模式应用
模式扩展
抽象工厂模式(JAVA反射)的更多相关文章
- 设计模式之第2章-抽象工厂模式(Java实现)
设计模式之第2章-抽象工厂模式(Java实现) “上次是我的不对,贿赂作者让我先讲来着,不过老婆大人大人有大量,不与我计较,这次还让我先把上次未讲完的应用场景部分给补充上去,有妻如此,夫复何求.”(说 ...
- C#设计模式之:抽象工厂模式与反射
抽象工厂模式[实例]:定义一个用于创建对象的接口,让子类决定实例化哪一个类 UML 代码class User{ private int _id; public int Id { get = ...
- 抽象工厂模式--java代码实现
抽象工厂模式 抽象工厂模式,对方法工厂模式进行抽象.世界各地都有自己的水果园,我们将这些水果园抽象为一个水果园接口,在中国.英国和美国都有水果园,种植不同的水果,比如苹果.香蕉和梨等.这里将苹果进行抽 ...
- 设计模式之抽象工厂模式(Java实现)
“上次是我的不对,贿赂作者让我先讲来着,不过老婆大人大人有大量,不与我计较,这次还让我先把上次未讲完的应用场景部分给补充上去,有妻如此,夫复何求.”(说完,摸了摸跪的发疼的膝盖,咳咳,我发四我没笑!真 ...
- AbstractFactoryPattern(抽象工厂模式)-----Java/.Net
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.
- Java设计模式(三) 抽象工厂模式
原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...
- iOS 抽象工厂模式
iOS 抽象工厂模式 什么是抽象工厂模式 简单了解一下 按照惯例,我们先了解一下什么是抽象工厂模式.抽象工厂模式和工厂方法模式很相似,但是抽象工厂模式将抽象发挥的更加极致,是三种工厂模式中最抽象的一种 ...
- 重学 Java 设计模式:实战抽象工厂模式
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!
- JAVA设计模式--抽象工厂模式
抽象工厂设计模式 1.系统中有多个产品族,而系统一次只可能消费其中一族产品2.同属于同一个产品族的产品以其使用.来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的 ...
随机推荐
- 爬取漫画DB上的JoJo的奇妙冒险 第七部 飙马野郎
SBR是JOJO系列我最喜欢的一部,所以今天把漫画爬取到本地,日后慢慢看. import re import time import requests from requests import cod ...
- jQuery---突出展示案例
突出展示案例 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UT ...
- Bootstrap资料
Bootstrap手册 : https://www.jqhtml.com/bootstraps-syntaxhigh/index.html 中文文档 :https://v3.bootcss.com/ ...
- python中的strip()方法
python中字符串str的strip()方法 str.strip()就是把字符串(str)的头和尾的空格,以及位于头尾的\n \t之类给删掉. 例1: str=" python " ...
- ubuntu set up 1 - 网络
r2v has to be replaced.. 1. 官网下载zip版本,下载安装脚本 https://www.r2v.com/chapter_00/install.html https://ins ...
- Hadoop的完全分布式搭建
一.准备虚拟机两台 1.将虚拟机进行克隆https://www.cnblogs.com/the-roc/p/12336745.html 2.1将克隆虚拟机的IP修改一下 vi /etc/sysconf ...
- JQuery函数 $.ajax()
ajax() 方法通过 HTTP 请求加载远程数据 该方法是 jQuery 底层 AJAX 实现.简单易用的高层实现见 $.get, $.post 等.$.ajax() 返回其创建的 XMLHttpR ...
- Alan Walker MV 合辑01 by defender 歌词
其实是歌词浏览,配套Alan Walker MV 合辑01 by defender You were the shadow to my life Did you feel us Another sta ...
- JFinal Enjoy指令扩展管理常用文本模板
个人博客 地址:http://www.wenhaofan.com/article/20190304102258 平时在项目中使用短信模板 邮件模板以及 站内消息通知等文本模板一般都是通过手动的字符串拼 ...
- VTK坐标系统及视图分割
计算机图像学里广泛应用的坐标系统有四种,分别是:模型坐标系统(model),世界坐标系统(world),视图坐标系统(view)和显示坐标系统(display). 模型坐标系统就是定义模型时所用的坐标 ...