02-week3-homework
发布于: 2020 年 12 月 13 日
请在草稿纸上手写一个单例模式的实现代码,拍照提交作业。
定义:Singleton 模式保证产生单一实例,就是说一个类只产生一个实例。使用 singleton 有两个原因:
是因为只有一个实例,可以减少实例频繁创建和销毁带来的资源消耗;
是当多个用户使用这个实例的时候,便于进行统一控制(比如打印机对象)。
前者是性能需求,后者是功能需求。
注意点:
一定要有私有的构造函数,保证类实例只能通过
getInstance()方法获得。懒汉模式中
getInstance的修饰符synchronized一定要加上,否则可能会产生多重实例。尽量使用饿汉模式构造单实例。
单例中的成员变量是多线程重用的,可能会产生意想不到的结果,因此尽量将单例设计为无状态对象(只提供服务,不保存状态)。
单例在 Java 这种语言环境下,有几种经典的实现方式,它们分别是:饿汉式、懒汉式、双重检测、静态内部类、枚举。
请用组合设计模式编写程序,打印输出图 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(忘记密码)复制代码
划线
评论
复制
发布于: 2020 年 12 月 13 日阅读数: 26
J
关注
还未添加个人签名 2015.06.24 加入
还未添加个人简介











评论