「架构师训练营」单例与组合模式的应用

发布于: 2020 年 06 月 23 日

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

语言:C#

懒汉式:

利用双重 if + lock 模式,达到线程安全的目的

饿汉式:

静态构造函数时由CLR保证,程序第一次使用这个类型前就会被调用,且只调用1次

单例的好处就是全局唯一的一个实例,避免对象重复创建,实现资源重用。但是也会常驻内存。

它通常应用于这些场景:

​ 数据库连接池(内置了资源)

​ 全局唯一号码生成器

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

语言:C#

IDE:Visual Studio 2019

Sdk:.net core 3.1

组件抽象类:

/// <summary>
/// 组件抽象类
/// </summary>
public abstract class AbstractControl
{
public string Name { get; set; }
public abstract void Show();
}

组件的基类:

public class Control:AbstractControl
{
public Control(string name)
{
Name = name;
}
public override void Show()
{
Console.WriteLine($"print {this.GetType().Name}({Name})");
}
}

由于有些组件是可以添加组件,例如 WinForm和Frame。而有些组件不能往里面添加组件。因此,增加一个容器的类

public class ContainerControl: Control
{
public ContainerControl(string name) : base(name) { }
private List<Control> ControlList = new List<Control>();
public void AddChild(Control control)
{
this.ControlList.Add(control);
}
public override void Show()
{
base.Show();
foreach (var control in ControlList)
{
control.Show();
}
}
}

个性化的组件:

public class WinForm:ContainerControl
{
public WinForm(string name) : base(name) { }
}
public class Frame:ContainerControl
{
public Frame(string name) : base(name) { }
}
public class Picture:Control
{
public Frame(string name) : base(name) { }
}
public class Button:Control
{
public Frame(string name) : base(name) { }
}
public class Lable:Control
{
public Frame(string name) : base(name) { }
}
public class TextBox:Control
{
public Frame(string name) : base(name) { }
}
public class PasswordBox:Control
{
public Frame(string name) : base(name) { }
}
public class CheckBox:Control
{
public Frame(string name) : base(name) { }
}
public class LinkLable:Control
{
public Frame(string name) : base(name) { }
}

组合各个组件并打印

class Program
{
static void Main(string[] args)
{
// 组合各个组件
var windowForm = new WinForm("WINDOW窗口");
windowForm.AddChild(new Picture("LOGO图片"));
windowForm.AddChild(new Button("登录"));
windowForm.AddChild(new Button("注册"));
var frame = new Frame("FRAME1");
frame.AddChild(new Lable("用户名"));
frame.AddChild(new TextBox("文本框"));
frame.AddChild(new Lable("密码"));
frame.AddChild(new PasswordBox("密码框"));
frame.AddChild(new CheckBox("复选框"));
frame.AddChild(new TextBox("记住用户名"));
frame.AddChild(new LinkLable("忘记密码"));
windowForm.AddChild(frame);
// 打印组件
windowForm.Show();
Console.ReadLine();
}
}

打印效果:

用户头像

Amy

关注

还未添加个人签名 2018.06.10 加入

还未添加个人简介

评论

发布
暂无评论
「架构师训练营」单例与组合模式的应用