架构师训练营第三章作业

用户头像
叮叮董董
关注
发布于: 2020 年 06 月 23 日
架构师训练营第三章作业

作业一:手写单例模式



说明:最近一段时间在北京出差,住的小区封闭管理,暂时出不去,没有纸笔,所以用txt格式代替。



恶汉模式



instance 静态实例就已经创建并初始化好了,所以,instance 实例的创建过程是线程安全的。





懒汉式



懒汉式相对于饿汉式的优势是支持延迟加载,但是并发操作需要加锁,导致并发度很低。





双重检测



既支持延迟加载、又支持高并发的单例实现方式。





作业二:用组合设计模式编写程序



类图:





组件接口定义



public interface Component {

void print();

}

基础组件定义

public abstract class AbstractComponent implements Component{

private String name;

public AbstractComponent(String name){
this.name = name;
}

@Override
public void print(){
System.out.println(name);
}

}



组合组件定义

public class ComponentGroup extends AbstractComponent {
private List<Component> components = new ArrayList<>();

public ComponentGroup(String name) {
this(name, null);
}

public ComponentGroup(String name, Collection<Component> comps) {
super(name);
if (comps != null) {
components.addAll(comps);
}
}

public void addComponent(Component comp) {
if (comp != null) {
components.add(comp);
}
}
@Override
public final void print() {
super.print();
components.stream().forEach(Component::print);
}
}

Button

public class Button extends AbstractComponent {
public Button(String name) {
super(name);
}
}

CheckBox

public class CheckBox extends AbstractComponent {
public CheckBox(String name) {
super(name);
}
}


Lable

public class Lable extends AbstractComponent {
public Lable(String name) {
super(name);
}
}

LinkLable

public class LinkLable extends AbstractComponent {
public LinkLable(String name) {
super(name);
}
}

PasswordBox

public class PasswordBox extends AbstractComponent {
public PasswordBox(String name) {
super(name);
}
}

Picture

public class Picture extends AbstractComponent{
public Picture(String name) {
super(name);
}
}

TextBox

public class TextBox extends AbstractComponent {
public TextBox(String name) {
super(name);
}
}

Frame

public class Frame extends ComponentGroup {
public Frame(String name) {
super(name);
}
}

WinForm

public class WinForm extends ComponentGroup {
public WinForm(String name) {
super(name);
}
}

Test

public static void main(String[] args) {
WinForm window = new WinForm("WINDOW窗口");
window.addComponent(new Picture("LOGO图片"));
window.addComponent(new Button("登录"));
window.addComponent(new Button("注册"));
Frame frame = new Frame("FRAME1");
window.addComponent(frame);
frame.addComponent(new Lable("用户名"));
frame.addComponent(new TextBox("文本框"));
frame.addComponent(new Lable("密码"));
frame.addComponent(new PasswordBox("密码框"));
frame.addComponent(new CheckBox("复选框"));
frame.addComponent(new Lable("记住用户名"));
frame.addComponent(new LinkLable("忘记密码"));
window.print();
}

执行结果



发布于: 2020 年 06 月 23 日 阅读数: 40
用户头像

叮叮董董

关注

还未添加个人签名 2020.04.08 加入

还未添加个人简介

评论 (2 条评论)

发布
用户头像
交流一下:
作业一有以下问题:
1. 饿汉写成了恶汉,public写成了publlic。
2. 其他实现方法的getInstance应该public。
3.【最严重】双重检查的instance没有加volatile来避免指令重排,因为new一个对象在字节码层面是不是原子的,并发会导致线程获取到半初始化状态的对象,导致程序异常,new至少包括3个步骤(new分配内存,invokespacial调用构造方法初始化对象,astore_1变量赋值);可以自行百度查一下,查完可以思考下为什么懒汉不需要volatile,双重检查则需要。

作业二问题:
打印结果输出格式不对,应该是
print WinForm(WINDOW窗口)
print Picture(LOGO图片)
print Button(登录)
print Button(注册)
print Frame(FRAME1)
print Lable(用户名)
print TextBox(文本框)
print Lable(密码)
print PasswordBox(密码框)
print CheckBox(复选框)
print TextBox(记住用户名)
print LinkLable(忘记密码)
展开
2020 年 06 月 28 日 14:39
回复
谢谢指正
2020 年 06 月 29 日 11:31
回复
没有更多了
架构师训练营第三章作业