利用工厂模式可以将对象的创建过程和使用进行分离(也就是解藕),从而促进了对象创建过程的封装。
在回顾前一篇随记初学Java设计模式随记 -- 工厂模式(Factory Pattern)中例子1和例子4时,可能会有这么几个的疑问:
为什么要有一个抽象产品类?
为什么工厂方法返回的是一个抽象产品类类型?
为什么在客户端调用时,也是通过抽象产品类来定义要产品类对象?
这就是工厂模式中产品类的多态性。
由于具体产品类继承(或实现)自抽象产品类,客户端就不必知道具体产品的真实类型,一样可以得到自己想要的产品。
这种多态性,促进了工厂模式的封装效果,工厂类将创建哪种产品,以及如何创建产品对象的细节完全封装了起来。
通过现实世界来理解多态性:
顾客A本来想买奥迪A6,正好厂家生产了新款的奥迪A8,奥迪A6停产了,而且价格差不多。于是,顾客A就更改了订单,买奥迪A8了。
那么,在例子1的基础上,我们只需要新添加一个具体产品类AudiA8Car,再修改工厂类CarFactory就可以了。
例子5:
奥迪A8(具体产品角色):
添加了一个新的具体产品类,一汽大众生产的新款汽车。
/*
* 奥迪A8,是一汽大众生产的一款汽车 (具体产品类)
*/
public class AudiA8Car extends Car {
public AudiA8Car(){
this.name = "奥迪A8";
}
public String toString(){
return "一辆"+ this.name;
}
}
一汽大众(工厂角色):
修改了静态的工厂方法manufactureCar(),原来返回的是AudiA6Car的对象,现在返回的是AudiA8Car的对象
/*
* 生产汽车的工厂,一汽大众 (工厂类)
*/
public class CarFactory {
/*
* 生产汽车(通过一个静态方法来得到一辆汽车的对象)
*/
public static Car manufactureCar(){
// 奥迪A6停产了
// return new AudiA6Car();
// 新款汽车奥迪A8
return new AudiA8Car();
}
}
汽车(抽象产品类角色):
与例子1相同,没有做任何变化。
/*
* 奥迪A6,是一汽大众生产的一款汽车 (具体产品类)
*/
public class AudiA6Car extends Car {
public AudiA6Car(){
this.name = "奥迪A6";
}
public String toString(){
return "一辆"+ this.name;
}
}
买这款奥迪A6汽车的顾客A(客户端):
也与例子1 相同,没有任何变化。
/*
* 购买汽车的顾客A(客户端)
*/
public class CustomerA {
public static void main(String[] args){
// 通过汽车工厂来制造出了一辆汽车
Car myCar = CarFactory.manufactureCar();
System.out.println("一辆汽车被造好,并且出厂了。");
// 顾客得到了一辆汽车,十分的高兴
System.out.println("我终于买了"+myCar+"。真是太好了!");
}
}
运行结果:
一辆汽车被造好,并且出厂了。
我终于买了一辆奥迪A8。真是太好了!
根据上面的运行结果,可以看到这种多态性带来的好处:
提高了封装效果,客户端不做任何改动,就实现了需求的变化。
总的来说,
工厂模式通过解耦和多态性,使得对象的创建和使用进行分离,并封装了复杂的对象创建过程,统一了对象的使用方式。
有利于代码的维护和修改,使代码更容易适应需求的变化,并降低了这些变化对系统的影响。
分享到:
相关推荐
NULL 博文链接:https://andycbluo.iteye.com/blog/2269582
Java.util包常用接口
java随记
OleDbDataAdapter 不会自动生成,为了使对 DataSet 所作的更改和相关联的数据源协调起来所必须的 SQL 语句。但是,如果设置了 OleDbDataAdapter 的 SelectCommand 属性,那么就可以创建 OleDbCommandBuilder 对象,来...
JSP PDF打印 随记 复杂模板设计
数据分级存储及访问方式设计方案研究随记.docx数据分级存储及访问方式设计方案研究随记.docx
c# 随记.docx
NULL 博文链接:https://lobin.iteye.com/blog/2365756
网络原理随记.pdf
互联网公司实习日记随记参考.pdf互联网公司实习日记随记参考.pdf互联网公司实习日记随记参考.pdf互联网公司实习日记随记参考.pdf互联网公司实习日记随记参考.pdf互联网公司实习日记随记参考.pdf
linux net 管理随记,留着个人备忘
三天不读书&智商输给猪-世界读书日ppt随记PPT模板.pptx
用户信息手账信息 第一章 用户信息信息设计 2 用户信息信息设计昵称限制:1~18位(非必需、如果没有输入则自动生成一个随机字符串6~12位、特殊符号非法)
学习c++过程中的一些知识点随记,我感觉重要的就稍微记了一下,比较简略,但是快速的阅读的话可以提醒自己想起那一部分的知识点。在复习c++知识点的时候,有些帮助。
Unity 随记1
生产不重复19位随机数,测试1000000数据没重复
git随记 git
面试随记???随时更新
一款很好用的java反编译软件,直接下载就可以使用,无需安装软件
重点小学生寒假记随记大全.doc