通过乐高玩具,带你认识设计模式中的建造者模式

您所在的位置:网站首页 乐高45024教程 通过乐高玩具,带你认识设计模式中的建造者模式

通过乐高玩具,带你认识设计模式中的建造者模式

2023-03-14 12:04| 来源: 网络整理| 查看: 265

前言

本文主要讲述建造者模式,文中会使用通俗易懂的案例,让你更好地学习本章知识点并理解其原理,做到有道无术。

一. 什么是建造者模式

建造者模式是23种设计模式中创建型模式的一种,它关注的是对象创建的步骤,将一个复杂的对象抽象出来,一步步地把一个复杂的对象创建出来。

二. 生活中的建造者模式

1.音乐

提到音乐,江帅比较喜欢周杰伦、陈奕迅的歌,也是听着他们的歌长大的,特别喜欢周董的青花瓷,不仅好听而且词还很美,不知道大家喜欢哪些歌手的歌曲。每一首动人的歌曲都是通过由一个个美妙的音符组合而成,使用相同音符但是不同循序组合而成的歌曲,也会是不同的歌曲,而这样形成的歌曲就像是设计模式中的建造者模式。

2.国粹

提到国粹,大家能联想到什么呢,江帅第一反应是京剧和麻将。而麻将这个活动,江帅也是很感兴趣的,逢年过节时我都会跟亲戚好友一起打打麻将。麻将的打法不同地区不一样,个数也不一样,但是总归分为那么几类牌,而不同的牌能够组合成不同胡牌的牌型,而通过不同的的麻将子,形成的胡牌牌型就像是设计模式中的建造者模式。

3.LEGO

乐高(LEGO)是知名的老少皆宜的玩具,乐高积木是由一块块的小积木拼接成的一个个成品模型,根据每个人的动手能力和想象力,最终拼出来的成品也会不一样。乐高每年都会举行比赛,每个参赛品都是江帅感觉怎么都拼不出来的艺术品,甚至不同的国家地区都会有各自的乐高比赛举行,而由不同积木组合而成的乐高成品,其实就像是设计模式中的建造者模式。

三. 建造者模式的实现

接下来江帅以一个人型乐高的模型来举例,用建造者模式来实现,我们先来创建一个产品角色乐高类。

package com.qianfeng.ran; /* * @author:江帅 * 产品角色 * 乐高类 */ public class Lego { //头部 private String head; //躯干 private String body; //手部 private String hand; //脚部 private String foot; public String getHead() { return head; } public void setHead(String head) { this.head = head; } public String getBody() { return body; } public void setBody(String body) { this.body = body; } public String getHand() { return hand; } public void setHand(String hand) { this.hand = hand; } public String getFoot() { return foot; } public void setFoot(String foot) { this.foot = foot; } @Override public String toString() { return "Lego{" + "head='" + head + '\'' + ", body='" + body + '\'' + ", hand='" + hand + '\'' + ", foot='" + foot + '\'' + '}'; } }

接下来创建抽象建造者具体建造者钢铁侠乐高类。

package com.qianfeng.ran; /** * @author:江帅 * 抽象建造者 * 建造乐高模型的接口,规定创建人型乐高模型的规范 */ public interface BuilderLego { //创建头部 void buildHead(); //创建躯干 void buildBody(); //创建手部 void buildHand(); //创建脚部 void buildFoot(); /** * 返回创建的乐高模型 */ Lego getLego(); } /* * @author:江帅 * 具体建造者 * 钢铁侠乐高 */ class IronManLego implements BuilderLego { private Lego lego; public IronManLego() { //创建乐高对象 lego = new Lego(); } @Override public Lego getLego() { return lego; } //------------通过规定的方法完成乐高模型的建造------------ @Override public void buildHead() { lego.setHand("钢铁头盔(AI系统)"); } @Override public void buildBody() { lego.setBody("钢铁战衣(集束炮)"); } @Override public void buildHand() { lego.setHead("钢铁手套(电弧脉冲炮)"); } @Override public void buildFoot() { lego.setFoot("钢铁战靴(推进器)"); } } /* * @author:江帅 * 具体建造者 * 高达乐高 */ class GunDamLego implements BuilderLego{ private Lego lego; public GunDamLego() { //创建乐高对象 lego = new Lego(); } @Override public Lego getLego() { return lego; } //------------通过规定的方法完成乐高模型的建造------------ @Override public void buildHead() { lego.setHand("高达头部(驾驶舱)"); } @Override public void buildBody() { lego.setBody("高达躯干(大口径光束加农炮)"); } @Override public void buildHand() { lego.setHead("高达手部(盾牌)"); } @Override public void buildFoot() { lego.setFoot("高达腿部(推进器)"); } }

再创建一个指挥者乐高的指挥者类。

package com.qianfeng.ran; /* * @author:Ran * 指挥者 * 乐高的指挥者 */ public class LegoDirector { /** * 创建乐高对象里的的具体内容 * @param builderLego * @return */ public Lego createLego(BuilderLego builderLego){ //创建头部 builderLego.buildHead(); //创建躯干 builderLego.buildBody(); //创建手部 builderLego.buildHand(); //创建脚部 builderLego.buildFoot(); //返回已构建完毕的乐高对象 return builderLego.getLego(); } }

最后通过建造者模式来创建我们需要的乐高对象。

package com.qianfeng.ran; /* * @author:江帅 * 客户端 */ public class Demo { public static void main(String[] args) { //创建管理者 LegoDirector legoDirector = new LegoDirector(); //-------创建钢铁侠的乐高模型------ Lego lego1 = legoDirector.createLego(new IronManLego()); //执行结果: //Lego{head='钢铁手套(电弧脉冲炮)', body='钢铁战衣(集束炮)', hand='钢铁头盔(AI系统)', foot='钢铁战靴(推进器)'} System.out.println(lego1.toString()); //-------创建高达的乐高模型-------- Lego lego2 = legoDirector.createLego(new GunDamLego()); //执行结果: //Lego{head='高达手部(盾牌)', body='高达躯干(大口径光束加农炮)', hand='高达头部(驾驶舱)', foot='高达腿部(推进器)'} System.out.println(lego2.toString()); } }四. 总结

通过建造者模式创建对象,封装性和扩展性会很好,客户端不需要知道产品内部组成的细节。但是每个产品组成部分必须相同,限制了使用范围,比如想创建个房子的乐高,那组合部分跟钢铁侠和高达都不同就创建不出来了。因此必须是相同的内部组成结构才会选择使用建造者模式。后续,江帅将带大家学习身外身法之术(设计模式之原型模式)。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3