代码重构

发布于: 2020 年 06 月 24 日
代码重构

如何写好一个单例模式

真正写好一个单例模式并不容易。

首先来看懒汉模式的写法,这种写法只能用在单线程执行的情况。为了在多线程情况下执行需要对 getInstance 方法增加 synchronized 关键字。然而这样做会降低程序执行效率。为了降低性能方面对影响,可以执行 synchronized 的作用范围。

上述写法的问题在于在类加载阶段,代码即被载入,如果一直没有被使用,会导致浪费空间。

此外上面的代码存在会被重复执行的问题。使用双重检查验证,可以避免重复执行的问题。也可以避免被提前加载的问题。

当然,也可以使用饿汉的单例写法。

更被推荐的写法是枚举写法。

如何写好一个组合模式

案例内容

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

示例代码

// 组件接口定义,组件树中的组件都需实现该接口
public interface Component{
public void print();
}

// 元组件抽象类
public abstract class MetaComponent implements Component {
private String name;
public MetaComponent(String name){
this.name = name;
}
public abstract void render();
@Override
public void print() {
System.out.println(this.name);
}
}

import java.util.ArrayList;
import java.util.List;
// 容器组件抽象类
public abstract class Container implements Component {
private List<Component> componentList = new ArrayList<Component>();
private String name = null;
public Container(String name) {
this.name = name;
}
public void addComponent(Component component) {
componentList.add(component);
}
public abstract void render();
@Override
public void print() {
System.out.println(this.name);
componentList.forEach(comp -> comp.print());
}
}

/**
* 叶子节点实现类
* 包括:Button/CheckBox/Lable/LinkLable/PasswordBox/Picture/TextBox
*/
public class Button extends MetaComponent {
public Button(String name) {
super(name);
}
@Override
public void render() {
}
}

/**
* 树干节点实现类
* 包括:WinForm/Frame
*/
public class WinForm extends Container {
public WinForm(String name) {
super(name);
}
@Override
public void render() {
// Window Form Render
}
}

// 构造组件树测试类
public class Test {
public static void main(String[] args){
Container loginPage = new WinForm("WinForm(WINDOW窗口)");
loginPage.addComponent(new Picture("Picture(LOGO图片)"));
loginPage.addComponent(new Button("Button(登录)"));
loginPage.addComponent(new Button("Button(注册)"));
Frame frame1 = new Frame("Frame(FRAME1)");
frame1.addComponent(new Lable("Lable(用户名)"));
frame1.addComponent(new TextBox("TextBox(文本框)"));
frame1.addComponent(new Lable("Lable(密码)"));
frame1.addComponent(new PasswordBox("PasswordBox(密码框)"));
frame1.addComponent(new CheckBox("CheckBox(复选框)"));
frame1.addComponent(new TextBox("TextBox(记住用户名)"));
frame1.addComponent(new LinkLable("LinkLable(忘记密码)"));
loginPage.addComponent(frame1);
loginPage.print();
}
}

参考:

[极客时间每日一课《在Java中如何写一个正确的单例模式?》](https://time.geekbang.org/dailylesson/detail/100044001)

[王友的《单例模式与组合模式总结与练习》]https://xie.infoq.cn/article/a36142188e1c43c07006f127e

用户头像

dongge

关注

还未添加个人签名 2017.10.19 加入

还未添加个人简介

评论

发布
暂无评论
代码重构