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