myeclipse怎么创建jframe类_创建型-建造者模式

一个对象创建的时候,需要各种初始化化,有一套复杂的创建流程,如果这些流程散布在系统各个地方的话,会越来越难以维护,因此建造者模式就是把一套复杂的创建某个具体产品的流程,管理起来。

定义:

将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式又叫创建者模式。创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。

类图:

2b104562d6716f849386e4cee66b8adf.png

cf086178a3d71329709705080b08d708.png

包含以下角色:

  • 导演类:负责调用适当的建造者来组建产品,导演类一般不与产品类发生依赖关系,一般充当提出需求的角色。与导演类直接交互的是建造者类。一般来说,导演类被用来封装程序中易变的部分。
  • 抽象建造者:引入抽象建造者的目的,是为了将建造的具体过程交与它的子类来实现。这样更容易扩展。一般至少会有两个抽象方法,一个用来建造产品,一个是用来返回产品。
  • 建造者:实现抽象类的所有未实现的方法,具体来说一般是两项任务:组建产品;返回组建好的产品。其实内部还是调用产品的函数。
  • 产品类:一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。在本类图中,产品类是一个具体的类,而非抽象类。实际编程中,产品类可以是由一个抽象类与它的不同实现组成,也可以是由多个抽象类与他们的实现组成。

模式流程:

  • 指挥者(Director)直接和客户(Client)进行需求沟通,控制建造者制造产品,最后给客户返回完整的产品;
  • 其中,在指挥者中控制构建的流程,建造者类只负责各个部件功能模块的实现;
  • 其中,建造者基类可以派生出不同的建造者子类来构建不同的产品;
  • 导演类提出需求之后,任务交接给了建造者。建造者有个基类来约定建造流程和返回产品等功能,由具体的建造者实施建造。

例子:

外部用户无需知道汽车是怎么创造出来的,他只需要给一个导演讲,他想要一个大众汽车,那么导演自动返回一个大众汽车。

用户有不同的需求,导演就有不同的手段来满足需求,来支配建造者实际真正的造一个东西出来, 在建造者建造的过程中,不断的给产品加装新功能,最终一件成品就出来啦。只不过加装的过程中,调用的是产品自己的加装函数。如: 汽车.设置发动机(发动机A);

导演只有一个,他可以造大众和悍马等不同的产品;

建造者有一套相同的流程,被抽象成了一个基类,具体的建造流程的实现,由子类来实现,比如 造大众建造者类和造悍马建造者类;

产品也继承同一个基类,派生出不同的产品类;

这样,我们既可以清晰的理出装配的流程,又能装配出不同的物品来。

代码实现:

游戏开发中,角色的创建可能比较复杂,因此需要建造者模式来创建角色并进行一些初始化。

角色分为玩家和敌人,他们的初始化方式有设置出生位置和设置技能。

当外部需要创建玩家或者敌人时,只需要告诉导演类,然后导演类控制角色创建的流程,建造者控制角色各个单独功能的实现。

产品:

 //产品基类
abstract class Product
{public abstract void SetPosition();public abstract void SetSkill();public abstract void ShowInfo();
}//产品子类:玩家类
class Player : Product
{public override void SetPosition(){Console.WriteLine("玩家设置位置");}public override void SetSkill(){Console.WriteLine("玩家设置技能");}public override void ShowInfo(){Console.WriteLine("玩家:位置xx,技能xx");}
}//产品子类:敌人类
class Enemy : Product
{public override void SetPosition(){Console.WriteLine("敌人设置位置");}public override void SetSkill(){Console.WriteLine("敌人设置技能");}public override void ShowInfo(){Console.WriteLine("敌人:位置xx,技能xx");}
}

建造者:

//建造者基类
abstract class Builder
{abstract public void SetProductPosition();abstract public void SetProductSkill();abstract public Product GetProduct();
}//建造者子类:玩家建造者
class PlayerBuilder : Builder
{Player player = new Player();public override void SetProductPosition(){player.SetPosition();}public override void SetProductSkill(){player.SetSkill();}public override Product GetProduct(){return player;}
}//建造者子类:敌人建造者
//...

导演类:

//导演类:负责建造流程的控制
class Director
{//创建玩家public Product CreatePlayer(){PlayerBuilder playerBuilder = new PlayerBuilder();playerBuilder.SetProductPosition();playerBuilder.SetProductSkill();return playerBuilder.GetProduct();}//创建敌人public void CreateEnemy(){//...同上,略}
}

客户端:

void Main()
{Director director = new Director();Product player = director.CreatePlayer();player.ShowInfo();
}

灵魂拷问:

1.工厂与建造者模式的联系和区别?
造汽车
工厂与建造者模式:工厂负责制造汽车,组装过程和细节在工厂内的建造者来实现;
买汽车
汽车购买者(用户):你只需要说出你需要的型号(对象的类型和内容),然后直接购买就可以使用了
(不需要知道汽车是怎么组装的(车轮、车门、发动机、方向盘等等))

工厂模式和建造者模式的关系:
与抽象工厂模式相比,建造者模式返回一个组装好的完整产品,而抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族 。
在抽象工厂模式中,客户端实例化工厂类,然后调用工厂方法获取所需产品对象,而在建造者模式中,客户端可以不直接调用建造者的相关方法,而是通过指挥者类来指导如何生成对象,包括对象的组装过程和建造步骤,它侧重于一步步构造一个复杂对象,返回一个完整的对象 。
如果将抽象工厂模式看成汽车配件生产工厂,生产一个产品族的产品,那么建造者模式就是一个汽车组装工厂,通过对部件的组装可以返回一辆完整的汽车

2.还是这个玩家和敌人的例子,如果将建造者和工厂模式结合起来,应该怎么设计代码呢?

建造者代码不需要怎么修改,只需要加上工厂代码即可。其实就是把之前工厂内部直接new 一个对象,变成由建造者来详细建造。

导演类做成单例模式:

//导演类:负责建造流程的控制
class Director
{//单例public static Director ins = new Director();//...
}

工厂代码:

//工厂基类
abstract class Factory
{abstract public Product NewProduct();
}//玩家工厂
class PlayerFactory : Factory
{public override Product NewProduct(){return Director.ins.CreatePlayer();}
}//敌人工厂
//...

客户端:

void Main()
{Product player = new PlayerFactory().NewProduct();player.ShowInfo();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/503713.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql占用内存吗_mysql占多少内存

展开全部MySQL 自身内存规62616964757a686964616fe4b893e5b19e31333433646463划说到 MySQL 自身的内存规划,最先想到的就是 MySQL 中各种 buffer 的大小,innodb buffer pool 就是最鹤立鸡群的那个。innodb_buffer_pool_size 参数的大小究竟如何设置&…

计算机鼠标装有,计算机鼠标装有传感器来监视鼠标的移动情况,如图

利用欧姆定律进行计算:根据串、并联电路的特点和欧姆定律的公式可进行有关计算。解题的方法是:(1)根据题意画出电路图,看清电路的组成(串联还是并联);(2)明确题目给出的已知条件与未知条件,并在电路图上标明&#xff1…

docker portainer_「实战篇」开源项目docker化运维部署-Portainer管理集群部署(十)...

之前都是通过命令的方式,管理docker的,其实docker还是有图形界面的。使用图形界面如何管理docker,其实业界很多公司都对docker进行了图形化的封装。之前在初级和中级的时候也有界面marathon。这里说下业界比较出名的portainer。portainer官网…

怎么快速搜索服务器里的文件,使用 Everything,快速搜索电脑文件,制作局域网资料搜索器 | 科技搜...

所需工具:Everything在 Windows 系统中,已经有自带的资源管理器文件查找功用,当然也有其他的一些软件辅佐查找,但是这些都不及一款软件,名字叫 Everything ,速度非常快,支持正则表达式&#xff…

hive left outer join 子查询临时表_基于历史数据的用户访问次数,每天新老用户,日活,周活,月活的hive计算...

最近有一个需求,统计每天的新老用户,日活,周活,月活。 我们每天的增量数据会加入到hive历史数据表中,包含用户访问网站的一些信息,字段有很多,包括用户唯一标识guid。 当然了日活,周…

sql server2008r2 没有提示_SQL学习之旅(1)

从2020.07.28开始跟着猴子哥系统学习数据库,在此记录自己的sql学习与练习过程,希望能为以后的自己带来帮助。SQL简介练习1:1.如何验证mysql数据库安装成功?在完成环境变量的配置的情况(在Path中添加mysql的bin目录路径…

order by 子查询_【框架】118:mybatis之多表高级查询

今天是刘小爱自学Java的第118天。感谢你的观看,谢谢你。学习内容安排如下:补充说明知识点:resultMap,sql片段。mybatis中的高级查询,即多表关联查询。查询主要分为:一对一,一对多,多…

css中变形,css3中变形处理

transfrom功能在css3 中可以使用transfrom功能实现文字或图像的旋转,缩放,倾斜,移动等变形处理deg是css3中使用的一种角度单位。旋转: 使用rotate方法,在参数中加入角度值,在角度值后要加上角度单位deg。旋…

获取 子文件夹 后缀_后期制作老司机教你一键批量生成项目文件夹

我猜你的项目工程是这样的,当你老板说去修改一下之前几个月的工程的时候,你都不知道哪个工程才是最终版呀。乱糟糟的工程而且当你打开工程的时候,wo艹,素材怎么丢失了~~不管是后期制作者还是平常我们日常工作,一定要养…

ffmpeg将文件转码后推向服务器,使用 Serverless 云函数 + ffmpeg 实现音视频转码服务...

核心价值视频应用、社交应用等场景下,用户上传的图片、音视频的总量大、频率高,对处理系统的实时性和并发能力都有较高的要求。例如:对于用户上传的视频短片,我们可以使用多个云函数对其分别处理,对应不同的清晰度(108…

python 怎么判断字符串是否有换行_JAVA中如何判断一个字符串是否换行

展开全部${rr.right_name}扩展资料 java控制台程序判断String字符e68a8462616964757a686964616f31333431373263串中只输入了一个回车: importjava.io.BufferedReader; importjava.io.InputStreamReader; importjava.util.Scanner; publicclassTest{ publicstaticvoi…

logger 参数列表过长_[源码级解析] 巧妙解决并深度分析Linux下rm命令提示参数列表过长的问题...

在维护实习单位服务器的过程中,偶然发现一个有350万文件的文件夹需要清理,于是我习惯性执行了rm -rf ./*,却在数秒后被告知“参数列表过长”。在一番折腾过后,我终于通过取巧的办法完成了这一任务,也随着相关内核源码的…

collect的功能是什么?其底层如何实现的?_为什么你要用 Spring ?

前言现在Spring几乎成为了Java在企业级复杂应用开发的代名词,得益于Spring简单的设计哲学和其完善的生态圈,确实为廉颇老矣,尚能饭否的 Java 带来了“春天”,有很多同学刚接触Java就直接从Spring框架开始学习,导致产生…

m3u8合并mp4软件_m3u8格式转mp4究极办法!

你们来这个号这么久了!还没给你们分享过一些实用的干货。打今天起这个公众号将给大家推荐一些APP和实用的小软件和一些小教程。生命太短,没时间留给遗憾。若不是终点,都不要把自己留在原地,请一直微笑向前!我是帮忙坏哥…

android 左移动画_android旋转动画和平移动画详解,补充说一下如果制作gif动画放到csdn博客上...

先上效果图:制作过程是先起一个模拟器,然后把GifCam的框拖到模拟器上面,点击Rec的new先,然后点击Rec,然后就save到本地成gif文件这里做一个左右旋转,上下旋转,和左右移动的动画,先自己建立一个View的类&…

vm虚拟机安装包_一次Miniconda虚拟机安装的神奇踩坑记录

本人一直都是在物理机环境下使用Anaconda,好处是提供了比较完全的机器学习包,还有方便的虚拟环境,缺点是体积太大。但如果直接用Anaconda中的根目录环境作为pycharm中的Python解释器,因为在运行程序前会不断加载根目录中的Python包…

css3弧形跑道效果_Css 实现漂亮弧形

在实现页面五花八门的有特色的ui时,我们有时会遇到要用实现一个弧形,而这样的弧形要怎么实现呢?用图片?好像不大现实,因为这样就要无故多加载一张图片了,这里我们来说说怎么用css的after伪类来实现弧形。先…

python螺旋圆的绘制_python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)...

插图工具使用Python内置的turtle模块,为什么叫这个turtle乌龟这个名字呢,可以这样理解,创建一个乌龟,乌龟能前进、后退、左转、右转,乌龟的尾巴朝下,它移动时就会画一条线。并且为了增加乌龟画图的艺术价值…

教室信息管理系统mysql_教师信息管理系统(方式一:数据库为oracle数据库;方式二:存储在文件中)...

方式一:运行截图数据库的sql语句:/*Navicat Oracle Data TransferOracle Client Version : 12.1.0.2.0Source Server : ORCZYTSource Server Version : 120100Source Host : localhost:1521Source Schema : C##ZYTTarget Server Type : ORACLETarget Ser…

python实现xmind_Python xmind库(生成框架图)

小编在测试日常工作中遇到一个费时的问题,如何将excel中的测试用例,生成测试框架图?经过查阅发现的python xmind库 将excel中的测试用例,生成测试框架图,分为2步 1.解析excel,取出excel中数据(此…