Skip to content

Commit 7d6fe48

Browse files
committed
新增多例模式
1 parent b45337f commit 7d6fe48

File tree

4 files changed

+127
-0
lines changed

4 files changed

+127
-0
lines changed

src/com/github/fengmaster/design/pattern/factory/absfactory/factory/SouthernFactory.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
public class SouthernFactory implements IAbsFactory {
1313
@Override
1414
public IFruit createFruit() {
15+
1516
return new TropicalFruit();
1617
}
1718

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package com.github.fengmaster.design.pattern.singleton.Multiton;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
import java.util.Random;
6+
import java.util.concurrent.ExecutorService;
7+
import java.util.concurrent.Executors;
8+
9+
/**
10+
* Created by Feng-master on 2017/9/26.
11+
* 单例模式拓展:多例模式
12+
* <p>
13+
* 应用场景:线程池等其他相关的资源场景
14+
*/
15+
public class Multiton1 {
16+
17+
private static final int num = 5;
18+
private static List<Multiton1> multiton1List = new ArrayList<>();
19+
private static Random random = new Random();
20+
21+
static {
22+
for (int i = 0; i < num; i++) {
23+
multiton1List.add(new Multiton1(i));
24+
}
25+
26+
}
27+
28+
private Multiton1(int i) {
29+
System.out.println("new Multiton1 index:"+i);
30+
31+
}
32+
33+
public static Multiton1 getInstance() {
34+
return multiton1List.get(random.nextInt(num));
35+
}
36+
37+
public static void main(String args[]){
38+
//测试多线程环境下情况
39+
ExecutorService executorService = Executors.newFixedThreadPool(20);
40+
41+
for (int i=0;i<30;i++){
42+
executorService.execute(new Runnable() {
43+
@Override
44+
public void run() {
45+
for (int i=0;i<30;i++){
46+
Multiton1 multiton1=Multiton1.getInstance();
47+
}
48+
49+
}
50+
});
51+
}
52+
53+
54+
55+
}
56+
57+
58+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package com.github.fengmaster.design.pattern.singleton.Multiton;
2+
3+
import java.util.List;
4+
import java.util.Random;
5+
import java.util.concurrent.CopyOnWriteArrayList;
6+
import java.util.concurrent.ExecutorService;
7+
import java.util.concurrent.Executors;
8+
9+
/**
10+
* Created by Feng-master on 2017/9/26.
11+
* 单例模式拓展:多例模式
12+
* <p>
13+
* 应用场景:线程池等其他相关的资源场景
14+
*/
15+
public class Multiton2 {
16+
17+
private static final int num = 5;
18+
private static List<Multiton2> multiton2List = Nested.list;
19+
private static Random random = new Random();
20+
private Multiton2() {
21+
System.out.println("new Multiton2");
22+
}
23+
24+
public static Multiton2 getInstance() {
25+
return multiton2List.get(random.nextInt(num));
26+
}
27+
28+
29+
public static class Nested {
30+
31+
private static List<Multiton2> list = new CopyOnWriteArrayList<>();
32+
33+
static {
34+
for (int i = 0; i < num; i++) {
35+
list.add(new Multiton2());
36+
}
37+
38+
}
39+
40+
}
41+
42+
public static void main(String args[]){
43+
//测试多线程环境下情况
44+
ExecutorService executorService = Executors.newFixedThreadPool(20);
45+
46+
for (int i=0;i<30;i++){
47+
executorService.execute(new Runnable() {
48+
@Override
49+
public void run() {
50+
for (int i=0;i<30;i++){
51+
Multiton2 multiton2=Multiton2.getInstance();
52+
}
53+
54+
}
55+
});
56+
}
57+
58+
59+
60+
}
61+
62+
}

src/com/github/fengmaster/design/pattern/singleton/Singleton1.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@
66
*
77
* 缺点:有时候本单例根本用不到,但还是会创建对象,占用空间
88
* 优点:简单,且适用于多线程环境
9+
*
10+
* {@link Singleton3}和第三种方法区别在于,1版本的单例模式,只要这个class被类加载器加载后,就会创建对象
11+
* 而3版本的单例模式,就算class被加载,也不会创建对象,只有在显式调用了{@link Singleton3#getInstance()}函数的时候
12+
* 才会创建单例对象
13+
*
14+
*
915
*/
1016
public class Singleton1 {
1117

0 commit comments

Comments
 (0)