【架构师训练营】week 3 homework
发布于: 2020 年 06 月 24 日
一、在草稿纸上手写一个单例模式的实现代码
主要手写了懒汉式和饿汉式两种方式实现的单例模式。单例模式的特点:
构造函数需要是 private 访问权限的,这样才能避免外部通过 new 创建实例;
考虑对象创建时的线程安全问题;
考虑是否支持延迟加载;
考虑 getInstance() 性能是否高(是否加锁)。
二、用组合设计模式编写程序
1.组件抽象类
public abstract class AbstractComponentNode { private String name; public AbstractComponentNode(String name) { this.name = name; } /** * 抽象方法:打印控件 */ public abstract void print(); public String getName() { return name; }}
2.抽象容器类
public abstract class AbstractContainer extends AbstractComponentNode { private List<AbstractComponentNode> subNodes = new ArrayList<>(); public AbstractContainer(String name) { super(name); } /** * 获取子元素列表 */ public List<AbstractComponentNode> getSubNodes(){ return subNodes; } /** * 添加子元素 */ public void addSubNode(AbstractComponentNode node){ subNodes.add(node); }}
3.组件实现类
public class Button extends AbstractComponentNode { public Button(String name) { super(name); } @Override public void print() { //...画一个Button System.out.println("Button("+getName()+")"); }}public class CheckBox extends AbstractComponentNode { public CheckBox(String name) { super(name); } @Override public void print() { //...画一个CheckBox System.out.println("CheckBox("+getName()+")"); }}public class Label extends AbstractComponentNode { public Label(String name) { super(name); } @Override public void print() { //...画一个Label System.out.println("Label("+getName()+")"); }}public class LinkLabel extends AbstractComponentNode { public LinkLabel(String name) { super(name); } @Override public void print() { //...画一个LinkedLabel System.out.println("LinkedLabel("+getName()+")"); }}public class PasswordBox extends AbstractComponentNode { public PasswordBox(String name) { super(name); } @Override public void print() { //...画一个PasswordBox System.out.println("PasswordBox("+getName()+")"); }}public class Picture extends AbstractComponentNode { public Picture(String name) { super(name); } @Override public void print() { //...画一个Picture System.out.println("Picture("+getName()+")"); }}public class TextBox extends AbstractComponentNode { public TextBox(String name) { super(name); } @Override public void print() { //...画一个TextBox System.out.println("TextBox("+getName()+")"); }}
4.容器实现类
public class WinForm extends AbstractContainer { public WinForm(String name) { super(name); } @Override public void print() { //...画WinForm System.out.println("WinForm("+getName()+")"); for(AbstractComponentNode node:getSubNodes()){ node.print(); } }}public class Frame extends AbstractContainer { public Frame(String name) { super(name); } @Override public void print() { //...画一个Frame System.out.println("Frame("+getName()+")"); for(AbstractComponentNode node:getSubNodes()){ node.print(); } }}
5.输出
WinForm window = new WinForm("Window窗口");Picture picture= new Picture("LOGO图片");Button button1 = new Button("登录");Button button2 = new Button("注册");window.addSubNode(picture);window.addSubNode(button1);window.addSubNode(button2);Frame frame = new Frame("FRAME1");Label label1 = new Label("用户名");TextBox textBox = new TextBox("文本框");Label label2 = new Label("密码");PasswordBox passwordBox = new PasswordBox("密码框");CheckBox checkBox = new CheckBox("复选框");Label label3 = new Label("记住用户名");LinkLabel linkLabel = new LinkLabel("忘记密码");frame.addSubNode(label1);frame.addSubNode(textBox);frame.addSubNode(label2);frame.addSubNode(passwordBox);frame.addSubNode(checkBox);frame.addSubNode(label3);frame.addSubNode(linkLabel);window.addSubNode(frame);window.print();
输出结果:
WinForm(Window窗口)Picture(LOGO图片)Button(登录)Button(注册)Frame(FRAME1)Label(用户名)TextBox(文本框)Label(密码)PasswordBox(密码框)CheckBox(复选框)Label(记住用户名)LinkedLabel(忘记密码)
划线
评论
复制
发布于: 2020 年 06 月 24 日 阅读数: 25
eazonshaw
关注
还未添加个人签名 2019.04.10 加入
还未添加个人简介
评论