锈才学设计模式之 —— 工厂模式(一)
工厂方法模式:工厂模式能封装具体类型的实例化,工厂方法模式定义了一个创建对象的接口,但是由子类通过继承抽象方法来决定实例化那一个类,将类的实例化放在子类中.
说明:在实例化具体类时,都是采用JAVA中的new关键字,这样就将具体类固定了,当需要利用其它产品时,必须修改代码实例化其它产品类,这样就失去了灵活性,丢失了OO的多态、封装、抽象等重要特性,下面是实例化例子:
== 实例化类 ==
Product product = new concreteProduct ();
大部人都会采用灵活一点的方式来实例化类,比如用一个方法来根据条件实例化类:
== 根据判断实例化类 ==
package com.jody.pattern.factory;
public class ProductOperation {
public void operation(String type){
if("concrete".equals(type)){
Product product = new ConcreteProduct(); //实例具体产品
}else if("other".equals(type)){
//实例其它产品
}
}
}
如果再遵守OO思想,把不变化的抽象出来,就可以将实例化类单独拿出来定义一个类,这个类专门负责生产产品,我们叫它工厂。比如:
== 静态实例化工厂类 ==
package com.jody.pattern.factory;
public static class ProductFactory {
public Product instance(String type){
Product product = null;
if("concrete".equals(type)){
product = new ConcreteProduct();
}else if("other".equals(type)){
//实例其它产品
product = .;
}
return product;
}
}
== 产品工厂类 ==
package com.jody.pattern.factory;
public class ProductOperation {
Product product;
public void operation(String type){
product = ProductFactory.instance(type);//用静态工厂生成产品
}
}
这种方式,只是将实例化单独定义一个类,当新增加一个产品(Product)时,就需要修改工厂内生成产品的定义(public Product instance(String type)),这样需要修改工厂的代码,以增加对新增产品的支持,显然这是不够弹性,根据OO思想:面向扩展开放,面向修改关闭,我们就需要采用工厂方法模式,将工厂抽象出来,面向接口(抽象)而不是面向实现进行设计编程。
工厂方法模式的结构
下面针对工厂方法模型进行代码描述
== 工厂接口(抽象)类 ==
package com.jody.pattern.factory;
//工厂方法接口(抽象)
public abstract class Creator {
public void operation(String type){
Product product;
//子类实现了些方法会调用子类factoryMethod()
product = factoryMethod(type);
//完成产品的操作
product.begin();
product.add();
product.end();
}
//生产(实例化)具体产品类
public abstract Product factoryMethod(String type);
}
== 工厂方法实现类 ==
package com.jody.pattern.factory;
//继承了抽象工厂类的抽象工厂子类
public class ConcreteCreator extends Creator {
//在这个方法中实现工厂的功能
@Override
public Product factoryMethod(String type) {
Product product = null;
//实例化具体产品类
if("concrete".equals(type)){
//product 是父类(Creator)中的商品接口引用
product = new ConcreteProduct();
}else if("other".equals(type)){
//实例其它产品
product = new ConcreteProduct();
}
return product;
}
}
== 产品接口(抽象)类 ==
package com.jody.pattern.factory;
//具体产品接口(抽象)类
public abstract class Product {
public abstract void begin();
public abstract void add();
public abstract void end();
}
== 产品实现类 ==
package com.jody.pattern.factory;
//产品实现类
public class ConcreteProduct extends Product {
@Override
public void add() {
// 增加
}
@Override
public void begin() {
// 开始
}
@Override
public void end() {
// 结束
}
}
== 测试调用类 ==
package com.jody.pattern.factory;
//测试
public class Test {
public static void main(String[] args){
//实例化一个工厂,调用方法
//new实例化类是必须实现的,如果不实例化对象,就无法编程了,
//所以总是需要实例化类
//工厂方法也不例外,但是工厂方法模式,让我们把实例化类封装起来
//更方便类实例化的管理和维护
Creator c = new ConcreteCreator();
c.operation("concrete");
}
}
类是程序的基础,实例化类是编程中用得最多的地方,每一个对象都需要实例化后才能发挥作用,工厂方法模式让我们将类的实例化封装起来,更好的管理.这正是符合OO的思想.
- 大小: 41 KB
分享到:
相关推荐
在线教学质量评价系统可以方便和全面地收集教师教学工作的数据,提供师生网上评教的评分结果,快速集中收集各方面的评教信息,使教务管理部门能够及时了解教学动态和师资情况,为教务老师提供相关决策支持,为职称评聘提供教学工作质量的科学依据,同时减轻了教务老师的工作量。
python-3.10.7-amd64.zip
自研扩散模型高光谱修复网络 基于MST_Plus_Plus 网络改造。 试验数据 扩散模型loss初步测试降到了0.005,比不加扩散loss小了20倍, 训练入口 train_cos_img.py
企业数据治理之数据安全治理方案
这是历年的毕业设计的项目,基于Android的一个红外防盗报警。需要自己添加蜂鸣器和热释电的硬件访问服务。
短视频用户价值研究报告2022
基于springboot的java毕业&课程设计
可运行源码(含数据库脚本)+开发文档+lw(高分毕设项目) java期末大作业毕业设计项目管理系统计算机软件工程大数据专业 内容概要:首先在日常的出行中,老旧城区道路狭窄,容易造成车辆的堵塞,每天早晚,接送孩子的车辆数密集,会造成相应的交通堵塞情况。而同样的,在停车的管理上,一方面我国的停车场面积较少,停车位一位难求,特别是在现在的一些小区里,为了抢停车位而产生的矛盾也日益突出。另一方面在停车场的管理上也存在着较大的管理问题,进车容易出车难是当下的停车场所出现的主要问题。而现在的停车场管理系统眼花缭乱,效果水平也良莠不齐,停车场的管理是当下各大城市的公共设施发展的一大难题,而国家、各大省市也都开 全套项目源码+详尽文档,一站式解决您的学习与项目需求。 适用人群: 计算机、通信、人工智能、自动化等专业的学生、老师及从业者。 使用场景及目标: 无论是毕设、期末大作业还是课程设计,一键下载,轻松部署,助您轻松完成项目。 项目代码经过调试测试,确保直接运行,节省您的时间和精力。 其他说明: 项目整体具有较高的学习借鉴价值,基础能力强的可以在此基础上修改调整,以实现不同的功能。
基于springboot的java毕业&课程设计
微信小程序设计之相关行业源码及图文导入教程
网络游戏开发是一项很大的工程,需要很多综合性的知识。这对于刚刚入门的开发者来说很难理解。本论文从研究开发一个模仿泡泡堂网络游戏的例子出发,讲述网络游戏开发中用到的一些最基本的知识和设计思想,使大家清晰的理解游戏开发的过程。 整个设计中利用java中的swing编程,结合游戏的操作流程,对整个游戏进行精心的设计和大量的测试,实现游戏软件服务器端和客户端的开发,为玩家提供一个友好美观的操作界面,并添加聊天等功能以增加玩家之间的互动性,此外实现了可编辑场景地图的功能,使得游戏内容的更加丰富,玩家交互性更好,确保了游戏更具有趣味性、灵活性,以满足玩家对这款网络游戏的要求。
外东洪路中段.m4a
软考3333333333
附件是Elasticsearch 的全文搜索功能使用方法,文件绿色安全,请大家放心下载,仅供交流学习使用,无任何商业目的!
1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
基于springboot的java毕业&课程设计
CCNP TSHOOT 642-832 Official Certification Guide
MySQL8.4.0 LTS(mysql-server_8.4.0-1ubuntu22.04_amd64.deb-bundle.tar)适用于Ubuntu 22.04 Linux (x86, 64-bit)
课设毕设基于SpringBoot+Vue的某银行OA系统 LW+PPT+源码可运行.zip