写点什么

02-week3-homework

用户头像
J
关注
发布于: 2020 年 12 月 13 日
  1. 请在草稿纸上手写一个单例模式的实现代码,拍照提交作业。


定义:Singleton 模式保证产生单一实例,就是说一个类只产生一个实例。使用 singleton 有两个原因:


  • 是因为只有一个实例,可以减少实例频繁创建和销毁带来的资源消耗;


  • 是当多个用户使用这个实例的时候,便于进行统一控制(比如打印机对象)。


前者是性能需求,后者是功能需求。


注意点:


  • 一定要有私有的构造函数,保证类实例只能通过getInstance() 方法获得。

  • 懒汉模式中 getInstance 的修饰符 synchronized 一定要加上,否则可能会产生多重实例。

  • 尽量使用饿汉模式构造单实例。

  • 单例中的成员变量是多线程重用的,可能会产生意想不到的结果,因此尽量将单例设计为无状态对象(只提供服务,不保存状态)。


单例在 Java 这种语言环境下,有几种经典的实现方式,它们分别是:饿汉式、懒汉式、双重检测、静态内部类、枚举。







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


package com.example.view.base;
/** * @author lvlin * @date 2020-12-13 11:06 AM */public abstract class AbstractComponent { protected final String name;
protected AbstractComponent(final String name) { this.name = name; }
/** * draw itself and sub components. */ public void doDraw(){ print(name); }
protected void print(String msg){ System.out.printf("print %s(%s)%n", this.getClass().getSimpleName(), msg); }}
复制代码


package com.example.view.base;
import java.util.LinkedList;import java.util.List;
/** * @author lvlin * @date 2020-12-13 11:10 AM */public abstract class AbstractContainer extends AbstractComponent {
private final List<AbstractComponent> components = new LinkedList<>();
protected AbstractContainer(String name) { super(name); }
public void add(AbstractComponent component) { components.add(component); }
@Override public void doDraw() { drawSelf(); for (final AbstractComponent component : components) { component.doDraw(); } }
/** * draw self */ protected void drawSelf(){ print(name); }}
复制代码


package com.example.view.container;
import com.example.view.base.AbstractContainer;
/** * @author lvlin * @date 2020-12-13 11:22 AM */public final class Frame extends AbstractContainer { public Frame(final String name) { super(name); }}
复制代码


package com.example.view.container;
import com.example.view.base.AbstractContainer;
/** * @author lvlin * @date 2020-12-13 11:10 AM */public final class Window extends AbstractContainer {
public Window(final String name) { super(name); }
@Override protected void drawSelf() { print(this.name); }}
复制代码


package com.example.view.components;
import com.example.view.base.AbstractComponent;
/** * @author lvlin * @date 2020-12-13 11:24 AM */public final class Button extends AbstractComponent { public Button(final String name) { super(name); }}
复制代码


package com.example.view.components;
import com.example.view.base.AbstractComponent;
/** * @author lvlin * @date 2020-12-13 11:26 AM */public final class CheckBox extends AbstractComponent { public CheckBox(final String name) { super(name); }}
复制代码


package com.example.view.components;
import com.example.view.base.AbstractComponent;
/** * @author lvlin * @date 2020-12-13 11:24 AM */public class Label extends AbstractComponent { public Label(final String name) { super(name); }}
复制代码


package com.example.view.components;
/** * @author lvlin * @date 2020-12-13 11:27 AM */public final class LinkLabel extends Label { public LinkLabel(final String name) { super(name); }}
复制代码


package com.example.view.components;
import com.example.view.base.AbstractComponent;
/** * @author lvlin * @date 2020-12-13 11:25 AM */public final class PasswordBox extends AbstractComponent { public PasswordBox(final String name) { super(name); }}
复制代码


package com.example.view.components;
import com.example.view.base.AbstractComponent;
/** * @author lvlin * @date 2020-12-13 11:22 AM */public final class Picture extends AbstractComponent { public Picture(final String name) { super(name); }}
复制代码


package com.example.view.components;
import com.example.view.base.AbstractComponent;
/** * @author lvlin * @date 2020-12-13 11:25 AM */public final class TextBox extends AbstractComponent { public TextBox(final String name) { super(name); }}
复制代码


package com.example;
import com.example.view.components.*;import com.example.view.container.Frame;import com.example.view.container.Window;
/** * @author lvlin * @date 2020-12-13 10:10 AM */public final class Main { public static void main(String[] args) { Window window = new Window("WINDOW窗口"); window.add(new Picture("LOGO图片")); window.add(new Button("登录")); window.add(new Button("注册")); Frame frame1 = new Frame("FRAME1"); frame1.add(new Label("用户名")); frame1.add(new TextBox("文本框")); frame1.add(new Label("密码")); frame1.add(new PasswordBox("密码框")); frame1.add(new CheckBox("复选框")); frame1.add(new TextBox("记住用户名")); frame1.add(new LinkLabel("忘记密码")); window.add(frame1);
window.doDraw(); }}
复制代码


执行结果


print Window(WINDOW窗口)print Picture(LOGO图片)print Button(登录)print Button(注册)print Frame(FRAME1)print Label(用户名)print TextBox(文本框)print Label(密码)print PasswordBox(密码框)print CheckBox(复选框)print TextBox(记住用户名)print LinkLabel(忘记密码)
复制代码



用户头像

J

关注

还未添加个人签名 2015.06.24 加入

还未添加个人简介

评论

发布
暂无评论
02-week3-homework