抽象工厂模式(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.同属于同一个产品族的产品以其使用.来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的 ...
随机推荐
- java exec python program
I find three methods, the first is using jython, the module of jython can transform the type of data ...
- open_basedir的配置
.user.ini的使用 1.限制目录访问 解锁: chattr -i .user.ini 加锁: chattr +i .user.ini .user.ini配置 open_basedir=/项目路径 ...
- SQLserver中存储图片
两种方式1.存放图片路径2.转换成2进制流(不过这样的话将很占用数据库空间)存路径的方式就很简单了,下面着重给出转换成2进制流的存入以及读取方法.存入:string FilePath="&q ...
- 机器学习作业(二)逻辑回归——Python(numpy)实现
题目太长啦!文档下载[传送门] 第1题 简述:实现逻辑回归. 此处使用了minimize函数代替Matlab的fminunc函数,参考了该博客[传送门]. import numpy as np imp ...
- 【转】idea远程调试
适用于web服务,thrift服务 对于分布式系统的调试不知道大家有什么好的方法.对于我来说,在知道远程调试这个方法之前就是在代码中打各种log,然后重新部署,上线,调试,这样比较费时.今天咱们来了解 ...
- mysql 数据库基础操作
一 知识储备 MySQL数据库基本操作知识储备 数据库服务器:一台计算机(对内存要求比较高) 数据库管理系统:如mysql,是一个软件 数据库:oldboy_stu,相当于文件夹 表:student, ...
- python3练习100题——036
原题链接:http://www.runoob.com/python/python-exercise-example36.html 题目:求100之内的素数. 之前有类似的题,所以这次遇到觉得很容易了, ...
- Java流,文件和I/O
java.io包中包含几乎所有可能永远需要在Java中执行输入和输出(I/ O)类.所有这些数据流代表一个输入源和输出目标. java.io包中的流支持多种数据,如基本类型,对象,本地化的字符等 流可 ...
- (转)数据库分片Shard操作
2.1.1什么是数据切分 "Shard" 这个词英文的意思是"碎片",而作为数据库相关的技术用语,似乎最早见于大型多人在线角色扮演游戏中."Shard ...
- open函数 文件设置缓冲
# 注释 将文件写入硬件设备时,使用系统调用,这类I/O操作一般时间很长 # 为了减少I/O次数操作,文件通常使用缓冲区(有足够的数据才进行系统调用) # 文件缓冲行为分为: # 全缓冲: open函 ...