一、概念

工厂方法模式是类的创建模式,又叫虚拟构造子模式(virtual constructor) 或者多态性工厂模式。
二、模式动机
定义一个抽像的工厂,将产品的具体创建工作推迟到抽像工厂的具体子类中,有些产品的创建非常复杂,试想如果将所有具体产品的创建工作都像简单工厂一样放到一个静态工厂方法中,那么这个工厂方法将无比巨大,且当需要扩展增加新的产品时,就必须修改原先的工厂方法,违背了开-闭原则,而工厂方法模式,对于每个具体产品的创建都有一个具体的工厂来创建,如果新增产品,只需要新增一个实现抽像工厂(或工厂接口)的具体工厂即可,也符合了开-闭原则。
三、模式的结构
从上图中我们可以看出,工厂方法涉及到4个角色
1.抽像工厂角色:该角色是工厂方法模式的核心,与应用程序无关,任何在模式中创建对像的工厂都必须实现这个接口,该角色往往是一个抽像的JAVA类或者接口。
2.具体工厂角色:该角色实现了抽像工厂,创建具体的产品,通常由一个具体的JAVA类来实现。
3.抽像产品角色:工厂方法模式所创建的产品的超类型,通常是一个JAVA抽像类或者JAVA接口。
4.具体产品角色:该角色实现了抽像产品接口,工厂方法所创建的每个对像都是这个角色的实例。
样例代码如下:
public abstract class Product
{
/**
* @roseuid 59AA7B2D03E7
*/
public Product()
{
}
}
public class ConcreteProduct1 extends Product
{
/**
* @roseuid 59AA7B2D037A
*/
public ConcreteProduct1()
{
}
}
public class ConcreteProduct2 extends Product
{
/**
* @roseuid 59AA7B2D03A1
*/
public ConcreteProduct2()
{
}
}
public abstract class Creator
{
/**
* @roseuid 59AA7B1600C6
*/
public Creator()
{
}
/**
* @return Product
* @roseuid 59AA77070055
*/
public abstract Product factoryMethod();
}
public class ConcreteCreator1 extends Creator
{
/**
* @roseuid 59AA7B2D031A
*/
public ConcreteCreator1()
{
}
/**
* @return Product
* @roseuid 59AA7707007B
*/
public Product factoryMethod()
{
return new ConcreteProduct1();
}
}
public class ConcreteCreator2 extends Creator
{
/**
* @roseuid 59AA7B2D034C
*/
public ConcreteCreator2()
{
}
/**
* @return Product
* @roseuid 59AA7707009B
*/
public Product factoryMethod()
{
return new ConcreteProduct2();
}
}
public class Client
{
private Creator theCreator;
/**
* @roseuid 59AA7AFC02D7
*/
public Client()
{
theCreator=new ConcreteCreator();
Product product=thCreator.factoryMathod();
}
}
四。模式样例
如现在有一个生产轮胎的工厂,该工厂可以生产benz车用的轮胎,还可以生产 bmw车子用的轮胎,后续还有可能生产audi车用的轮胎等等。由于 benz车用的轮态和bmw车子用的轮轮胎可能有比较大的差别,所用的材料和模具都会有所不同,工艺要求也不同,可以说要用不同的产品线(相当于一个子工厂)来生产(实例化),我们就可以用工厂的方法来
描述轮胎的产生过程,每个轮胎都颜色,都有寿命和胎面宽度等指标,于是我们可以抽像出一个轮胎的接口,所有的轮胎都应该是实现这个接口的类的实例,如下图所示:
当我们又增加了一条生产Audi车轮胎的产品线时,工厂方法能很好的适应,如上图我们只需增加一个AudiTire的具体产品类,然后再增加一个实例化该产品类的AudiTireFactory工厂就可以了,其它的工厂及产品类不需要做任何的修改,从此可以看出工厂方法模式对于同一产品等级下增加新的产品时是支持开闭原则的。
五、模式的约束
该模式只针对一个产品等级结构下的产品进行有效扩展,如上例,如果我们要增一个发动机的产品,工厂类就无法适应了。
六、模式的变体与扩展
如一个轮胎厂,他是benz旗下的子公司,他只生产benz车所使用的轮胎,那么这时抽像工厂类就没有必要了,只需要一个具体工厂就可以了,这时工厂方法模式的多态性工厂功能就退化了,如下图:
往往工厂只需要一个实例就可以了,所以上图工厂类的factoryMethod()就可以直接改为静态的方法,这样就直接退化为了简单工厂模式。
该工厂只生产benz车轮胎,那么轮胎的抽像接口其实也没有必要了,可以进一步退化如下图:
七、与其它模式的关系
暂略
八、模式优缺点
工厂方法模式,在同一个产品等级结构下,可以有效的支持开闭原则,但是不适用于增加新的产品等级结构
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# java
# 设计模式
# 工厂方法
# java编程创建型设计模式工厂方法模式示例详解
# Java设计模式之简单工厂 工厂方法 抽象工厂深度总结
# java设计模式之工厂方法模式
# Java设计模式之工厂模式分析【简单工厂、工厂方法、抽象工厂】
# java设计模式学习之工厂方法模式
# Java 深入探究讲解工厂方法模式
# 就可以
# 只需要
# 是一个
# 都有
# 如下图
# 车用
# 有必要
# 可以看出
# 创建工作
# 都是
# 实现了
# 开闭
# 样例
# 很好
# 他是
# 也没
# 可以说
# 可以用
# 只需
# 我们可以
相关文章:
如何在IIS管理器中快速创建并配置网站?
建站之星安装路径如何正确选择及配置?
如何选择服务器才能高效搭建专属网站?
如何高效完成独享虚拟主机建站?
Android自定义控件实现温度旋转按钮效果
如何用低价快速搭建高质量网站?
制作网站公司那家好,网络公司是做什么的?
如何正确选择百度移动适配建站域名?
网站按钮制作软件,如何实现网页中按钮的自动点击?
微课制作网站有哪些,微课网怎么进?
云南网站制作公司有哪些,云南最好的招聘网站是哪个?
沈阳制作网站公司排名,沈阳装饰协会官方网站?
建站主机核心功能解析:服务器选择与网站搭建流程指南
整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?
如何选择靠谱的建站公司加盟品牌?
如何在宝塔面板中创建新站点?
如何将凡科建站内容保存为本地文件?
jQuery 常见小例汇总
建站之星ASP如何实现CMS高效搭建与安全管理?
如何用PHP工具快速搭建高效网站?
宝塔面板如何快速创建新站点?
微网站制作教程,我微信里的网站怎么才能复制到浏览器里?
建站之星如何实现五合一智能建站与营销推广?
电商网站制作公司有哪些,1688网是什么意思?
天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?
如何制作算命网站,怎么注册算命网站?
如何在西部数码注册域名并快速搭建网站?
网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?
建站之星手机一键生成:多端自适应+小程序开发快速建站指南
早安海报制作网站推荐大全,企业早安海报怎么每天更换?
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
,巨量百应是干嘛的?
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
招贴海报怎么做,什么是海报招贴?
如何在云虚拟主机上快速搭建个人网站?
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
建站VPS推荐:2025年高性能服务器配置指南
如何选择PHP开源工具快速搭建网站?
如何在腾讯云免费申请建站?
如何在VPS电脑上快速搭建网站?
道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?
如何在万网主机上快速搭建网站?
教学网站制作软件,学习*后期制作的网站有哪些?
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
c# await 一个已经完成的Task会发生什么
香港服务器网站推广:SEO优化与外贸独立站搭建策略
如何高效完成自助建站业务培训?
可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
北京专业网站制作设计师招聘,北京白云观官方网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。