抽象工厂模式 java实例 tclhaier_完整案例分析再加知识整合——艾特工厂方法模式,超详细的...

本文详细介绍了工厂方法模式,包括模式动机、定义、结构与分析,以及通过电视机工厂的Java实例来阐述如何使用该模式。通过工厂子类创建具体产品,实现了开闭原则,增强了系统的灵活性和可扩展性。
摘要由CSDN通过智能技术生成

工厂方法模式

模式动机与定义

模式动机

format,png

模式定义

工厂方法模式(Factory Method Pattern)简称工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。

在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。

模式结构与分析

模式结构

format,png

工厂方法模式包含如下角色:

Product:抽象产品

ConcreteProduct:具体产品

Factory:抽象工厂

ConcreteFactory:具体工厂

模式分析

工厂方法模式是简单工厂模式的进一步抽象和推广

工厂方法模式保持了简单工厂模式的优点,并克服了它的缺点

核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给其子类去完成

可以允许系统在不修改工厂角色的情况下引进新产品

增加具体产品-->增加具体工厂,符合“开闭原则”

Java反射机制的应用

format,png

配置文件的应用

format,png

工具类XMLUtil代码片段

format,png

模式实例与解析

模式实例

电视机工厂:实例说明

将原有的电视机工厂进行分割,为每种品牌的电视机提供一个子工厂,海尔工厂专门负责生产海尔电视机,海信工厂专门负责生产海信电视机,如果需要生产TCL电视机或创维电视机,只需要对应增加一个新的TCL工厂或创维工厂即可,原有的工厂无需做任何修改,使得整个系统具有更好的灵活性和可扩展性。

电视机工厂:参考类图

format,png

电视机工厂:参考代码

代码结构:

format,png

TV接口

package factorymethod;

public interface TV {

public void play();

}

HaierTV类

package factorymethod;

public class HaierTV implements TV {

@Override

public void play() {

System.out.println("海尔电视机播放中···");

}

}

HisenseTV类

package factorymethod;

public class HisenseTV implements TV {

@Override

public void play() {

System.out.println("海信电视机播放中···");

}

}

TVFactory接口

package factorymethod;

public interface TVFactory {

public TV produceTV();

}

HaierTVFactory类

package factorymethod;

public class HaierTVFactory implements TVFactory {

@Override

public TV produceTV() {

System.out.println("海尔电视机工厂生产海尔电视机!");

return new HaierTV();

}

}

HisenseTVFactory类

package factorymethod;

public class HisenseTVFactory implements TVFactory {

@Override

public TV produceTV() {

System.out.println("海信电视机工厂生产海信电视机!");

return new HisenseTV();

}

}

FactoryMethodconfig.xml

factorymethod.HisenseTVFactory

XMLUtil类

package factorymethod;

import org.w3c.dom.Document;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import java.io.File;

public class XMLUtil {

//该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象

public static Object getBean(){

try {

//创建文档对象

DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();

DocumentBuilder builder = dFactory.newDocumentBuilder();

Document doc;

doc = builder.parse(new File("D:\\MyNewWorld\\Study_JAVA\\MyHome\\Write_java\\My_Maven\\src\\main\\resources\\FactoryMethodconfig.xml"));

//获取包含类名的文本节点

NodeList n1 = doc.getElementsByTagName("className");

Node classNode = n1.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类

package factorymethod;

public class Client {

public static void main(String[] args) {

try {

TV tv;

TVFactory factory;

factory = (TVFactory) XMLUtil.getBean();

tv = factory.produceTV();

tv.play();

}catch (Exception e){

System.out.println(e.getMessage());

}

}

}

运行结果

format,png

format,png

format,png

format,png

模式效果与应用

工厂方法模式优点

工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节

能够让工厂自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部。

在系统中加入新产品时,完全符合开闭原则

工厂方法模式缺点

系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,会给系统带来一些额外的开销。

增加了系统的抽象性和理解难度。

在以下情况下可以使用工厂方法模式:

客户端不知道它所需要的对象的类(客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可,具体产品对象由具体工厂类创建)

抽象工厂类通过其子类来指定创建哪个对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值