本篇来说一说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();
    }
}

恩,玩了这两家出品的游戏,发现还是某荣耀家小姐姐多! 可以看到,我们玩了这两家的游戏,发现项目很庞大! 英雄类,武器类,工厂类。 但是,发现没?我们再加个刺客类英雄,或者加个打野类武器,都很简单! 好事者称,我要加个血量! 滚!抽象工厂不欢迎你!工厂模式自己玩去!

---------------分割线------------------ 这个我是参考了很多网上的分析而写的,对于区别网上好多意见都不一致,我就按照自己的理解写的。 好多都有对应的专有名词,比如产品等级结构,产品族。我个人认为这些东西放到博客里面有违我这逗逼的气质,而且可能让理解更困难,就不加入进去了! 关于游戏这些内容的纯属虚构,并没有任何褒贬意思!不要想多!