享元模式
当需要多个对象但是每个对象仅有部分数据不同时可以使用享元模式,本质上就是使用一个容器将对象储存起来,使用的时候从中获取,常用的容器时HashMap。
棋接口:
public interface Chess {
void setNum(int num);
}
围棋实现类:
public class WeiQi implements Chess {
private String name;
private int num;
public WeiQi(String name) {
this.name = name;
}
@Override
public void setNum(int num) {
this.num=num;
}
public int getNum() {
return num;
}
}
获取棋子工厂类
public class ChessFactory {
HashMap<String, WeiQi> chessHashMap = new HashMap<>();
public WeiQi getChess(String name) {
if (chessHashMap.get(name) == null) {
chessHashMap.put(name, new WeiQi(name));
}
return chessHashMap.get(name);
}
public int getSize(){
return chessHashMap.size();
}
}
实现类:
public class MyClass {
public static void main(String[] args) {
ChessFactory chessFactory = new ChessFactory();
WeiQi chess = chessFactory.getChess("黑棋");
chess.setNum(2);
System.out.println(chess.getNum());
WeiQi chess2 = chessFactory.getChess("黑棋");
chess2.setNum(3);
System.out.println(chess2.getNum());
WeiQi chess3 = chessFactory.getChess("黑棋");
chess3.setNum(4);
System.out.println(chess3.getNum());
WeiQi chess4 = chessFactory.getChess("白棋");
chess4.setNum(5);
System.out.println(chess4.getNum());
WeiQi chess5 = chessFactory.getChess("白棋");
chess5.setNum(6);
System.out.println(chess5.getNum());
WeiQi chess6 = chessFactory.getChess("白棋");
System.out.println(chess6.getNum());
// System.out.println(chessFactory.getSize());
}
}
组合模式
将对象组合成树形,类似于文件系统。分为组合部件,为所有内容提供统一的实现,叶子节点,不能包含内容,类比文件,合成部件,可以包含合成部件以及叶子,类比于目录。
public abstract class Entry {
public String name;
public Entry(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void add(Entry entry) {
}
public abstract void prt(String pre);
}
文件
public class File extends Entry{
public File(String name) {
super(name);
}
@Override
public void prt(String pre) {
System.out.print(pre+"/"+getName());
}
}
目录:
public class Direcrory extends Entry {
LinkedList<Entry> entries = new LinkedList<>();
public Direcrory(String name) {
super(name);
}
@Override
public void add(Entry entry) {
entries.add(entry);
}
@Override
public void prt(String pre) {
System.out.println(pre + "/" + getName());
for (Entry entry : entries) {
entry.prt(pre + "/" + getName());
}
}
}
测试
public class MyClass {
public static void main(String[] args){
File file=new File("txt");
Direcrory home=new Direcrory("home");
Direcrory wghcwc=new Direcrory("wghcwc");
Direcrory var=new Direcrory("var");
Direcrory etc=new Direcrory("etc");
Direcrory bin=new Direcrory("bin");
Direcrory opt=new Direcrory("opt");
home.add(var);
home.add(wghcwc);
home.add(file);
var.add(opt);
var.add(etc);
etc.add(bin);
home.prt("");
}
}