homework 3
发布于: 2020 年 06 月 24 日
1:手写一个单例
单里的实现方式大概有
饿汉式
实例在初始化的时候就已经建好了,不管你有没有用到,都先建好了再说。好处是没有线程安全的问题,坏处是浪费内存空间
懒汉式
实例在用到的时候才去创建,用的时候才去检查有没有实例,如果有则返回,没有则新建。有线程安全和线程不安全两种写法,区别就是synchronized关键字
双重校验锁
综合了懒汉式和饿汉式两者的优缺点整合而成。既保证了线程安全,又比直接上锁提高了执行效率,还节省了内存空间
静态内部类
类似双重锁,只有第一次调用getInstance方法时,虚拟机才加载 Inner 并初始化instance ,只有一个线程可以获得对象的初始化锁,其他线程无法进行初始化,保证对象的唯一性。目前此方式是所有单例模式中最推荐的模式
手写
2. 请用组合设计模式编写程序,打印输出图 1 的窗口,窗口组件的树结构如图 2 所示,打印输出示例参考图 3。
//动作接口public interface Printer { void print();}//一级组件public class Component implements Printer { private String name; public Component(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public void print() { System.out.println(" -" +name); }}//二级组件public class Widget implements Printer { private String name; public Widget(String name) { this.name = name; } @Override public void print() { System.out.println(" --" + name); }}//一级容器public class WinForm extends Component { private List<Component> list = new ArrayList<>(); public WinForm(String name) { super(name); } public void add(Component component) { this.list.add(component); } public void remove(Component component) { list.remove(component); } @Override public void print() { System.out.println(getName()); list.forEach(s -> { s.print();}); }}//二级容器public class Frame extends Component { private List<Widget> list = new ArrayList<>(); public Frame(String name) { super(name); } public void add(Widget widget) { list.add(widget); } public void remove(Widget widget) { list.remove(widget); } @Override public void print() { super.print(); list.forEach(s -> { s.print(); }); }}public class Picture extends Component { public Picture(String name) { super(name); }}public class Button extends Component { public Button(String name) { super(name); }}//组件public class CheckBox extends Widget { public CheckBox(String name) { super(name); }}public class Label extends Widget { public Label(String name) { super(name); }}public class LinkLable extends Widget { public LinkLable(String name) { super(name); }}public class PasswordBox extends Widget { public PasswordBox(String name) { super(name); }}public class TextBox extends Widget { public TextBox(String name) { super(name); }}//客户端public class Client { public static void main(String[] args) { WinForm winForm = new WinForm("Window窗口"); Picture pic = new Picture("LOGO图片"); winForm.add(pic); winForm.add(new Button("登录")); winForm.add(new Button("注册")); Frame frame = new Frame("FRAME1"); frame.add(new Label("用户名")); frame.add(new TextBox("文本框")); frame.add(new Label("密码")); frame.add(new PasswordBox("密码框")); frame.add(new CheckBox("复选框")); frame.add(new TextBox("记住用户名")); frame.add(new LinkLable("忘记密码")); winForm.add(frame); winForm.print(); }}//结果Window窗口 -LOGO图片 -登录 -注册 -FRAME1 --用户名 --文本框 --密码 --密码框 --复选框 --记住用户名 --忘记密码
划线
评论
复制
发布于: 2020 年 06 月 24 日阅读数: 45
东哥
关注
还未添加个人签名 2018.03.25 加入
还未添加个人简介
评论