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 加入
还未添加个人简介
评论