抽象工厂模式(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.同属于同一个产品族的产品以其使用.来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的 ...
随机推荐
- 841. 字符串哈希(hash)
给定一个长度为n的字符串,再给定m个询问,每个询问包含四个整数l1,r1,l2,r2l1,r1,l2,r2,请你判断[l1,r1l1,r1]和[l2,r2l2,r2]这两个区间所包含的字符串子串是否完 ...
- 使用yum安装报错:[Errno 256] No more mirrors to try
背景:我使用yum方式安装软件时,比如zabbix这种软件,我们在安装时一般都是直接到zabbix官网,按照官方的步骤进行安装,但是有一个问题,官方的服务器不在国内,时常会在安装时导致超时报错.此时解 ...
- Web基础-Uri跟Url的区别
关于URL和URI的区别,个人见解. 初学java,最近被一个概念搞得头晕脑胀,就是url和uri的概念和区别,网上查了一大通,发现各种回答眼花缭乱,有百科直接粘贴的,有胡说八道的,有故意绕来绕 ...
- .gitignore文件说明-git提交时可忽略的文件
在我们平时做项目时,总有一些文件不想提交到服务器的版本管理上 这时就要设置相应的忽略规则,来忽略这些文件的提交 规则 作用/mtk 过滤整个文件夹*.zip 过滤所有.zip文件/mtk/do.c 过 ...
- MySQL 8.0.18 在 Windows Server 2019 上的安装(ZIP)公开
AskScuti MySQL : Windows Server 2019 安装 MySQL 8.0 温馨提示:为了展现我最“魅力”的一面,请用谷歌浏览器撩我. 一切就绪,点我开撩
- python面试的100题(21)
正则表达式 94.请写出一段代码用正则匹配出ip? ip地址的生成规则. IP地址,是由32位数字二进制转为四个十进制的字符串组成. 怎么转化?下面讲解: 二进制:111111111111111111 ...
- react中用swiper实现大图功能
1.引入Swiper(用的是4.5.0版本) import Swiper from 'swiper'; //引入样式,还可以加上自己的样式 import '../../s ...
- [TJOI2017] DNA - 后缀数组,稀疏表
[TJOI2017] DNA Description 求模式串与主串的匹配次数,容错不超过三个字符. Solution 枚举每个开始位置,进行暴力匹配,直到失配次数用光或者匹配成功.考虑到容错量很小, ...
- 五、抗DDOS防火墙
简介 DDoS全名是Distribution Denial of service (分布式拒绝服务攻击).拒绝服务攻击的攻击方式有很多种,最基本的Dos攻击就是利用合理的服务请求来占用过多的服务资源, ...
- Hydra暴力破解工具
hydra [[[-l LOGIN|-L FILE] [-p PASS|-P FILE]] | [-C FILE]] [-e nsr] [-o FILE] [-t TASKS] [-M FILE [- ...