1. 请在草稿纸上手写一个单例模式的实现代码,拍照提交作业。

说明:笔者拍照实现饿汉式单例类,也就是应用一启动,就会把单例对象加载到内存。

问什么要试用 Singleton

Singleton 模式保证产生单一实例,就是说一个类只产生一个实例。试用 Singleton 有两个原因

  • 是因为只有一个实例,可以减少实例频繁创建和销毁带来的资源消耗。
  • 是当多个用户试用这个实例的时候,便于进行统一控制(比如打印机对象)。

前者是性能需求,后者是功能需求。

饿汉式 Singleton

public class HungrySingleton {private static HungrySingleton instance = new HungrySingleton();private HungrySingleton() {}public static HungrySingleton getInstance() {return instance;}
}

注意:一定要有私有的构造函数,保证实例只能通过getInstance() 方法获得。

尽量使用饿汉式构造单实例。单例中的成员变量是多线程重用的,可能会产生意想不到的结果,因此尽量将单例设计为无状态对象(只提供服务,不保存状态)。

饿汉式 Singleton 的问题是,应用一启动就加载对象进内存,就算从来未被用过。

懒汉式 Singleton

publci class LazySingleton {private static LazySingleton instance = null;private LazySingleton() {}public static synchronized LazySingleton getInstance() {if (instance == null) {instance = new LazySingleton();}return instance;}
}

注意: getInstance() 的修饰符 synchronized 一定要加上,否则可能会产生多重实例。

懒汉式Singleton解决了饿汉式Singleton,当调用的时候才去加载对象到内存。但是引发了另外一个性能问题,每次访问对象都要加锁。

提升性能的 懒汉式 Singleton

publci class LazySingleton {private static LazySingleton instance = null;private LazySingleton() {}public static LazySingleton getInstance() {if (instance == null) {instance = LazySingleton.buildInstance();}return instance;}private static synchronized LazySingleton buildInstance() {if (instance == null) {instance = new LazySingleton();}return instance;}
}

只有当对象为null的时候,才去加锁创建对象。

2. 请用组合设计模式编写程序

打印输出图 1 的窗口,窗口组件的树结构如图 2 所示,打印输出示例参考图 3。

组合模式的类图:

package structure;import java.util.ArrayList;
import java.util.List;interface Item {void print();String getName();void setName(String name);List<Item> getChilds();int addChild(Item item);
}abstract class Component implements Item {private List<Item> childs = new ArrayList<>();private String name;@Overridepublic String getName() {return name;}@Overridepublic void setName(String name) {this.name = name;}@Overridepublic List<Item> getChilds() {return childs;}@Overridepublic void print() {String className = this.getClass().getSimpleName();System.out.println("print " + className + "(" + getName() + ")");List<Item> childs = getChilds();for (Item item: childs) {item.print();}}@Overridepublic int addChild(Item item) {List<Item> childs = getChilds();if (childs == null) {return 0;}if (item != null) {childs.add(item);}return childs.size();}
}class WinForm extends Component { }
class Button extends Component { }
class CheckBox extends Component { }
class Frame extends Component { }
class Label extends Component { }
class LinkLabel extends Component { }
class PasswordBox extends Component { }
class Picture extends Component { }
class TextBox extends Component { }public class Composition {public static void main(String[] args) throws IllegalAccessException, InstantiationException {Item mainForm = createChild("WINDOW窗口", WinForm.class);addChilds(mainForm);mainForm.print();}static <T> Item createChild(String name, Class<T> clazz) throws IllegalAccessException, InstantiationException {Item child = (Item)clazz.newInstance();child.setName(name);return child;}static void addChilds(Item mainForm) throws InstantiationException, IllegalAccessException {mainForm.addChild(createChild("LOGO图片", Picture.class));mainForm.addChild(createChild("登录", Button.class));mainForm.addChild(createChild("注册", Button.class));Item frame = createChild("FRAME1", Frame.class);mainForm.addChild(frame);frame.addChild(createChild("用户名", Label.class));frame.addChild(createChild("文本框", TextBox.class));frame.addChild(createChild("密码", Label.class));frame.addChild(createChild("密码框", PasswordBox.class));frame.addChild(createChild("复选框", CheckBox.class));frame.addChild(createChild("记住用户名", TextBox.class));frame.addChild(createChild("忘记密码", LinkLabel.class));}
}

输出结果

print WinForm(WINDOW窗口)
print Picture(LOGO图片)
print Button(登录)
print Button(注册)
print Frame(FRAME1)
print Label(用户名)
print TextBox(文本框)
print Label(密码)
print PasswordBox(密码框)
print CheckBox(复选框)
print TextBox(记住用户名)
print LinkLabel(忘记密码)

第二题助教老师提供的参考答案(Java实现)

https://github.com/kim118000/geek-code

极客大学架构师训练营 框架开发 第三次作业相关推荐

  1. 可复制领导力 - 极客大学架构师训练营 架构师老A

    说明 分享人: 架构师老A 分享主题:<可复制领导力> 分享提纲: 个人能力成长阶梯 东西方领导力差异 管理者角色认知 架构师老A自我介绍 老A亲爱的老师们,同学们,大家好晚上,今晚由我给 ...

  2. 极客大学架构师训练营大作业

    大作业 背景 产品需求 技术方案建议 练习要求 用例图 泳道图 部署图 时序图 用户下单&支付 快递员位置上报 系统派单 订单状态图 背景 产品需求 技术方案建议 练习要求 用例图 说明: ● ...

  3. 极客大学产品经理训练营 产品文档和原型 作业4

    作业 [本周作业]写一个用例,挑一个:你自己的产品 / 你喜欢的产品 / [拍东西]发起拍卖/ [知识星球]加入星球/ [极客时间]购买课程: 1. 标题作者修改历史 标题:[极客时间]购买课程 作者 ...

  4. 极客大学产品经理训练营:数据分析与商业分析,商业分析到业务分析 第18课总结

    讲师:邱岳 1. 产品经理眼中的利润.成本.收入 利润 = 收入 - 成本 奶茶利润率极高,达到60%左右.但是奶茶盈利比较难. 所有买水的产品利润率都极高,比如可口可乐,咖啡,奶茶等. 案例:有个面 ...

  5. 极客大学产品经理训练营:业务流程与产品文档 第11课总结

    讲师:邱岳 1. 原型图 1.1 手绘图 + Scanner Pro 1.2 线框图 1.3 高保真产品图 1.4 做原型图的目的 坍缩:规划时梦到自己成了乔布斯,赶紧画个图让自己冷静冷静: 具体:具 ...

  6. 极客大学产品经理训练营:产品文档和原型咋弄 - 流程图 第9课总结

    讲师:邱岳 1. 图的意义 流程图.活动图.时序图.状态图,本次聚焦于过程和行为描述. 提效.宏观.点睛. 梳理思路 用例:做什么? 流程图:怎么做? 2. 流程图.活动图.时序图 3. 动手画 – ...

  7. 极客大学产品经理训练营 极客时间购买课程-大作业

    1. 标题作者修改历史 标题:[极客时间]购买课程 作者 历史 时间 易筋 创建 2021-01-09 易筋 添加购买流程图6 2021-03-02 易筋 添加购买时序图7 2021-03-16 2. ...

  8. 极客大学产品经理训练营:业务架构与概念模型 第10课总结

    讲师:邱岳 1. 什么是状态图 系统中的概念或对象随着一些事件的发生,改变了状态,通常这个状态比较多.比较复杂时,我们需要用状态图来表示他们的边界,以及触发状态转换的活动. 2. 动手画 – 员工状态 ...

  9. 极客大学产品经理训练营:PRD 产品原型文档框架 第12课总结

    讲师:邱岳 1. PRD 产品原型文档的各种元素 PRD: Product Requirement Document 产品原型文档 基本元素(目录.标题.作者.版本.历史等). 场景描述. 需求背景. ...

  10. 极客大学产品经理训练营:运营思维 第19课总结

    讲师:邱岳 1. 运营是做什么的 运转·经营. 产品经理经常拆房子.盖新房子.经营是要持续经营一个产品. CEO.COO(Apple 的Tim Cook以前就是).CTO.CFO.CIO- 运营其实是 ...

最新文章

  1. Highchart插件下载与安装
  2. c语言中isnarc变量,C语言 二级 1-40上机模拟试题答案.doc
  3. 百度云android隐藏空间,一招教你使手机端百度网盘中的隐藏空间在文件列表中显示出来...
  4. C语言不调用库函数画一个三角形
  5. cs1.5 linux服务端,CS1.5在linux上的配置
  6. simulink显示多个数据_如何在 Simulink 中使用 PID Tuner 进行 PID 调参?
  7. UIButton 的简单运用
  8. python中字符串函数的作用_python 基础学习笔记(2)---字符串功能函数
  9. 高并发、高性能 Web 架构
  10. hadoop启动mysql服务_Hadoop MySQL 服务自启动配置
  11. 电脑里面英文系统的中文简介
  12. DevOps落地实践:通讯行业系列:NTT COMWARE之Devaas
  13. 机械制造业信息化的基础是管理变革
  14. 如何禁用GeForce Experience的奖励广告
  15. Teambition X 2019 校招
  16. java-web实训项目:simonshop(3)Servlet层
  17. linux notepadqq不支持中文输入的原因分析
  18. 刨根问底:对象也可以当方法用?
  19. Acala 全球征文精选
  20. 物理信息驱动的深度学习相比于传统数值方法的潜在优势

热门文章

  1. android 按钮变形动画,android-动画切换按钮
  2. jquery 元素第二个_jQuery知识总结
  3. ai一个线段多个箭头_「平面设计」Illustrator(AI)基础教学-第2章 绘制简单的图形...
  4. linux筛选方式,使用grep实现精确过滤的五种方法
  5. 完整的vue-cli3项目创建过程以及各种配置
  6. node中exports和module.exports的关系及使用
  7. 解析ES6箭头函数中的this
  8. 动态规划——Palindrome Partitioning II
  9. 二维码生成,打包下载zip,BigDecimal的取值和计算,java发送http请求
  10. Python与模块--01sys