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官网…

php 执行mysql查询_php中执行mysql的常用操作

连接到mysql服务器:$conn mysql_connect($host,$user,$password) or die ("连接失败");mysql_query($conn);选择数据库:$usedbmysql_select_db("$db_name")or die ("连接失败");mysql_query($usedb);解决在mysql数据库中…

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

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

python循环结构语句_python控制语句---循环结构语句

这次主要把循环结构的控制语句补上,主要包含while、for、continue、break、循环嵌套。主要写一些基本的认识以及包含的一些实例。当只有唯一路径且只跑一次的时候选择上一节中的选择结构语句就可以了,但是当执行一次或者重复循环执行时就需要另辟蹊径了&…

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

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

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

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

lptv自建服务器,如何搭建自己的IPTV平台

概述IPTV平台包括鉴权服务器、EPG服务器和媒体服务器。IPTV机顶盒首先与鉴权服务器进行通信,鉴权成功后获取EPG服务器和UserToken。EPG服务器实现节目内容导航、播放控制等用户界面。媒体服务器以RTSP协议实现流媒体传输。机顶盒与鉴权服务器和EPG服务器之间的通信都…

mysql事务prepare_mysql之 事务prepare 与 commit 阶段分析

打开binlog选项后,执行事务提交命令时,就会进入两阶段提交模式。两阶段提交分为prepare阶段和commit两个阶段。流程如下 :这里面涉及到两个重要的参数:innodb_flush_log_at_trx_commit和sync_binlog,参数可以设置不同的…

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

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

小程序使用css变量,小程序使用css变量实现“换肤”方案

使用sass,stylus可以很方便的使用变量来做样式设计,其实css也同样可以定义变量,在小程序中由于原生不支持动态css语法,so,可以使用css变量来使用开发工作变简单。基础用法page {--main-bg-color: brown;}.one {color: white;backg…

笔试MySQL读写速度优化_笔试题:优化mysql数据库的方法

优化mysql数据库的方法,(1).数据库设计方面,这是DBA和Architect的责任,设计结构良好的数据库,必要的时候,去正规化(英文是这个:denormalize,中文翻译成啥我不知道),允许部分数据冗余,避免JOIN操作,以提高查询效率(2).系统架构设计方面,表散列,把海量数据散列到几个不…

css找某个元素的下个子元素,CSS可以检测一个元素有多less个子元素?

注:这个解决scheme将返回一定长度的子集,而不是你所要求的父元素。 希望它仍然有用。安德烈路易斯提出了一个方法: http : //lea.verou.me/2011/01/styling-children-based-on-their-number-with-css3/不幸的是,它只适用于IE9及以…

python文本聚类分析_python机器学习kmeans算法——对文本进行聚类分析

#!/usr/bin/env python#-*- coding: utf-8 -*-#File : kmeans.py#Author: 田智凯#Date : 2020/3/19#Desc :机器学习kmeans算法,对科技成果项目进行聚类分析 from __future__ importprint_functionimporttimefrom sklearn.feature_extraction.text importTfidfVector…

lock字段mysql_MySQL的lock tables和unlock tables的用法(转载)

早就听说lock tables和unlock tables这两个命令,从字面也大体知道,前者的作用是锁定表,后者的作用是解除锁定。但是具体如何用,怎么用,不太清楚。今天详细研究了下,总算搞明白了2者的用法。lock tables 命令…

css中变形,css3中变形处理

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

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

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

mysql排序行号_mysql 取得行号后再排序

一.理论准备Map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等。TreeMap:基于红黑树(Red-Black tree)的 NavigableMap 实现,该映射根据其键的自然顺序进行排序,或者根据创建映射…

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

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