【注意】最后更新于 December 18, 2017,文中内容可能已过时,请谨慎使用。
本篇来说一说java设计模式之抽象工厂模式。
我们有一篇文章是说的工厂模式,为什么还要来一个抽象工厂模式呢?
因为我们在用java啊!java适合做大项目嘛!(我才不会说java能把所有的项目都做成大项目呢!)
既然要说抽象工厂模式,那就跟工厂模式有什么区别呢?
看名称,多了个抽象!就是说工厂返回的是实例,而抽象工厂返回的是接口!
现在我们明白了,有两家公司,都想做moba游戏。
做moba嘛,
都得能够设计英雄对吧,还得给英雄武器。(抽象的工厂)
某者荣耀说,好,我创建战士,能抗能打,还要攻击的武器,破军,伤害高!(具体工厂)
某荣说,那我创建adc,你抓不到我呢,我就打死你了。为了防止手滑操作失误,我要创建个保护的武器,斗篷。(有一个具体的工厂)
我们看到了,战士,还有adc都是英雄,可以提取抽象的类。破军还有斗篷都是武器,可以抽象称类。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
package top.txiner.abstractfactory;
public interface Weapon {
public void function();
}
package top.txiner.abstractfactory;
public class PoJun implements Weapon {
public void function() {
System.out.println("I can kill any one!");
}
}
package top.txiner.abstractfactory;
public class DouPeng implements Weapon {
public void function() {
System.out.println("no one can kill me");
}
}
|
具体的参数设计好了,那就得设计谁用啦!
这块跟工厂模式没太大区别,还是粘贴上吧。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
package top.txiner.abstractfactory;
public interface Summoner {
public void skillOne();
public void skillTwo();
public void skillThree();
}
package top.txiner.abstractfactory;
public class Soldier implements Summoner {
public void skillOne() {
System.out.println("I am soldier and I am invincible");
}
public void skillTwo() {
System.out.println("I am soldier and I am unbeatable");
}
public void skillThree() {
System.out.println("I am soldier and I am most powerful");
}
}
package top.txiner.abstractfactory;
public class ADC implements Summoner {
public void skillOne() {
System.out.println("I am adc and I can shoot you");
}
public void skillTwo() {
System.out.println("I am adc and I can attack you in a long distance");
}
public void skillThree() {
System.out.println("I am adc and I am a little weak");
}
}
|
好了,开干!建厂子!
玩moba有共识啊!都有一样的套路,就是有些自己的修改!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
package top.txiner.abstractfactory;
public interface GameDesigner {
public Summoner createSummoner();
public Weapon createWeapon();
}
package top.txiner.abstractfactory;
public class WangZheDesigner implements GameDesigner {
public Summoner createSummoner() {
return new Soldier();
}
public Weapon createWeapon() {
return new PoJun();
}
}
package top.txiner.abstractfactory;
public class XuRongDesigner implements GameDesigner {
public Summoner createSummoner() {
return new ADC();
}
public Weapon createWeapon() {
return new DouPeng();
}
}
|
那就来玩玩看看!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
package top.txiner.abstractfactory;
public class Player {
public static void main(String[] args) {
GameDesigner designer = new WangZheDesigner();
Summoner summoner = designer.createSummoner();
Weapon weapon = designer.createWeapon();
summoner.skillOne();
weapon.function();
designer = new XuRongDesigner();
summoner = designer.createSummoner();
weapon = designer.createWeapon();
summoner.skillOne();
weapon.function();
}
}
|
恩,玩了这两家出品的游戏,发现还是某荣耀家小姐姐多!
可以看到,我们玩了这两家的游戏,发现项目很庞大!
英雄类,武器类,工厂类。
但是,发现没?我们再加个刺客类英雄,或者加个打野类武器,都很简单!
好事者称,我要加个血量!
滚!抽象工厂不欢迎你!工厂模式自己玩去!
---------------分割线------------------
这个我是参考了很多网上的分析而写的,对于区别网上好多意见都不一致,我就按照自己的理解写的。
好多都有对应的专有名词,比如产品等级结构,产品族。我个人认为这些东西放到博客里面有违我这逗逼的气质,而且可能让理解更困难,就不加入进去了!
关于游戏这些内容的纯属虚构,并没有任何褒贬意思!不要想多!