写点什么

架构师课程第三周作业

用户头像
杉松壁
关注
发布于: 2020 年 06 月 23 日

一、请在稿纸上手写一个单例模式的实现代码。(拍照提交作业)

单例模式的意思是在一次运行中某个对象只允许创建一个实例。这种模式适合在对一些竞争资源的处理访问。如果全局只有一个实例,可以保证在处理资源的过程中不存在竞争。

单例模式的实现分类:

  1. 饿汉式:在类加载的时候创建对象,不支持延迟加载;

  2. 懒汉式:与饿汉式相对,将对象初始化延迟到使用对象的时候,不支持高并发;

  3. 双重检测:妥协饿汉和懒汉,既支持延迟加载、又支持高并发。

以下是Golang语言的单例模式的简单实现。通过sync包中的Once对象保证之后被初始化一次对象。

二、请用组合设计模式编写程序,打印输出图1的窗口,窗口组件的树结构如图2所示。打印输出示例参考图3。

由于是树形结构,可以使用Golang中的container/list实现。代码如下。

package main
import (
"container/list"
"fmt"
)
type Tree interface {
Do()
}
type node struct {
*list.List
name string
}
type leaf struct {
name string
}
func (n node) Do() {
for e := n.Front(); e != nil; e = e.Next() {
e.Value.(Tree).Do()
}
fmt.Printf("name: %s\n", n.name)
}
func (n node) Add(sub Tree) {
n.PushBack(sub)
}
func (n node) Del(ele *list.Element) {
n.Init().Remove(ele)
}
func (l leaf) Do() {
fmt.Printf("name: %s\n", l.name)
}
func main() {
// l := list.New()
window := node{list.New(), "window"}
picture := leaf{"picture"}
signin := leaf{"登录"}
signup := leaf{"注册"}
frame1 := node{list.New(), "Frame1"}
userlabel := leaf{"用户名"}
usertxt := leaf{"user文本框"}
passlabel := leaf{"密码"}
passtxt := leaf{"pass密码框"}
check := leaf{"check"}
remeber := leaf{"remember"}
forget := leaf{"forget"}
frame1.Add(userlabel)
frame1.Add(usertxt)
frame1.Add(passlabel)
frame1.Add(passtxt)
frame1.Add(check)
frame1.Add(remeber)
frame1.Add(forget)
window.Add(picture)
window.Add(frame1)
window.Add(signin)
window.Add(signup)
window.Do()
}

运行结果:

name: picture
name: 用户名
name: user文本框
name: 密码
name: pass密码框
name: check
name: remember
name: forget
name: Frame1
name: 登录
name: 注册
name: window

三、总结

本周主要内容有:软件设计模式介绍,介绍了工厂模式、单例模式、组合模式、模板模式、装饰器模式。不管使用不使用设计模式,使用什么设计模式,我们最终的目标都是将软件设计为高内聚、松耦合的整体系统。之所以要设计成这样,是为了维护方便、代码有结构整洁、方便扩展。所以,国外的前人们根据实际经验总结出了一些可适配的方法模式。

虽然有的时候老师觉得这些东西不值一提,但是我在听的时候确实是不太懂,可能是我基础不够好吧。设计模式虽然看似简单,但是内容还是很多的,而且很多的设计模式不好区分,容易混淆。想要把设计模式灵活使用,估计也需要大量的学习与真实场景的实践。对于很多人来说,根本不会有这么多的实践机会能用到所有的设计模式。况且很多时候,我们在使用的过程中也不会刻意的注意这些点。所以,设计模式也不好学。

用户头像

杉松壁

关注

还未添加个人签名 2018.03.30 加入

还未添加个人简介

评论

发布
暂无评论
架构师课程第三周作业