Skip to content

Commit abe4bda

Browse files
committed
添加对享元模式的解析
1 parent 213888c commit abe4bda

File tree

5 files changed

+121
-0
lines changed

5 files changed

+121
-0
lines changed
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
享元模式:
2+
是对象池的一种实现,英文名为flyweight,代表轻量级的意思。享元模式用来尽可能的减少内存使用量,它适合用于
3+
可能存在大量重复对象的场景。来缓存可共享对象,达到共享对象,避免重复创建的效果
4+
5+
享元对象中的部分对象是可以共享的,可以共享的状态成为内部状态,内部状态不随着环境的变化而变化,不可共享
6+
的状态称之为外部状态,他们会随着环境的变化而变化。享元模式中会建立一个对象容器,在经典的享元模式 中
7+
该容器为一个map。它的键是享元对象的内部状态,他的值就是享元对象本身。这样,客户端程序通过这个内部状态
8+
从享元工厂中获取享元对象,如果有缓存,则使用缓存,没有缓存则创建一个享元对象放入缓存。
9+
10+
定义:
11+
使用享元对象可以有效地支持大量细粒度的对象
12+
13+
使用场景:
14+
1.系统中存在大量的相似对象
15+
2.细粒度的对象都具备较接近的外部状态,而且内部状态与环境无关,也就是说对象没有特定身份
16+
3.需要缓冲池的场景
17+
18+
JDK中的String也是类似消息池,一般定义的String是存在与常量池中的。
19+
String的equals只是根据字符值来进行判断。两个==表示用来判断这两个对象是否相等,也就是两个对象指向的
20+
内存地址
21+
22+
Android中的运用:
23+
Message
24+
UI不可以在不是它的创建线程中进行更新
25+
26+
Android应用是事件驱动的,每个事件都会转化为一个系统消息,即Message.消息中包含了事件相关的信息
27+
和这个消息的处理人----handler。每一个进程中都有一个默认的消息队列,即MessageQueue,这个消息队列
28+
维持了一个待处理的消息列表,有一个消息循环不断的从这个队列中取出消息,处理消息。这样就使得应用动态地运作
29+
起来了。它的工作原理就像是工厂的生产线一样,待加工的产品就是Message,Looper就是发动机。传送带就是MessageQueue,工人们就是
30+
处理事件的Handler。
31+
因为Android是事件驱动的,所以会产生很多的Message,使用享元模式很好的解决了系统的性能问题。
32+
33+
Message消息池没有使用map这样的容易,而是使用了来链表,next指向的是下一个Message
34+
在创建Message的时候并不会把Message对象放到池中,在回收(并不是指虚拟机的回收操作)的时候,该对象才会被
35+
添加到对应的链表中
36+
插入或者获取都是从链表的头部
37+
38+
每个Handler都会关联一个消息队列,消息队列被封装在Looper中,而每个Looper又是ThreadLocal的,也就是说每个线程只
39+
会属于一个线程
40+
41+
42+
Looper属于某个线程,消息队列存储在Looper中。因此,消息队列就通过Looper与特定的线程关联起来。而
43+
Handler又与Looper相关联,因此最终,handler就和线程、线程中的消息队列关联起来了。因此就可以通过handler
44+
发送和不处理这个线程上的事件
45+
46+
handler使用的常规步骤:
47+
1.Looper.prepare() 没有这一步会报错
48+
2.handler =new Handler()
49+
3.Looper.loop(); 没有这一步发送过来的消息虽然添加到了消息队列,但是没有启动消息循环,就不会获取这个消息并且执行
50+
51+
Looper对象封装了消息队列,Looper对象被封装在ThreadLocal中,使得不同的线程之间Looper不能被共享
52+
53+
54+
总结:
55+
享元模式在优化的场景中及其重要。大大较少了程序创建的对象,降低了内存的占用,增强了程序的性能。同时增加了
56+
程序的复杂性
57+
58+
优点:大大降低了内存中对象的数目
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.company.sharemeta.ticket;
2+
3+
public class Test {
4+
public static void main(String[] args) {
5+
Ticket ticket01 = TicketFactory.getTicket("北京", "青岛");
6+
ticket01.showTicketInfo("上铺");
7+
8+
Ticket ticket02 = TicketFactory.getTicket("北京", "青岛");
9+
ticket02.showTicketInfo("下铺");
10+
11+
Ticket ticket03 = TicketFactory.getTicket("北京", "青岛");
12+
ticket03.showTicketInfo("下铺");
13+
14+
}
15+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.company.sharemeta.ticket;
2+
3+
public interface Ticket {
4+
void showTicketInfo(String bunk);//展示火车票信息
5+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.company.sharemeta.ticket;
2+
3+
import java.util.Map;
4+
import java.util.concurrent.ConcurrentHashMap;
5+
6+
public class TicketFactory {
7+
static Map<String, Ticket> tickets = new ConcurrentHashMap<>();
8+
9+
public static Ticket getTicket(String from, String to) {
10+
String key = from + "-" + to;
11+
if (tickets.containsKey(key)) {
12+
System.out.println("使用缓存 ==》" + key);
13+
return tickets.get(key);
14+
} else {
15+
System.out.println("创建对象 ==》" + key);
16+
TrainTicket ticket = new TrainTicket(from, to);
17+
tickets.put(key, ticket);
18+
return ticket;
19+
}
20+
}
21+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.company.sharemeta.ticket;
2+
3+
import java.util.Random;
4+
5+
public class TrainTicket implements Ticket {
6+
7+
public String from;
8+
public String to;
9+
public String bunk;//铺位
10+
public int price;
11+
12+
public TrainTicket(String from, String to) {
13+
this.from = from;
14+
this.to = to;
15+
}
16+
17+
@Override
18+
public void showTicketInfo(String bunk) {
19+
price = new Random().nextInt(300);
20+
System.out.println("购买 从 " + from + " 到 " + to + " 的" + bunk + " 火车票" + ", 价格: " + price);
21+
}
22+
}

0 commit comments

Comments
 (0)