当前位置:首页>编程知识库>后端开发知识>设计模式是什么鬼(抽象工厂)
设计模式是什么鬼(抽象工厂)
阅读 1
2018-12-24

//本文作者:凸凹里歐

//本文收录菜单栏:《设计模式是什么鬼》专栏中

抽象工厂,意味着工厂的泛化,也就是说对多个工厂共通行为的抽取及概括。这和我们之前讲过的工厂方法模式十分类似,不同之处在于抽象工厂定义了更多的抽象行为,也就是多个工厂方法于抽象工厂中,其实它就是工厂方法的变种而已,所以建议读者先理解好工厂方法模式再回来看本章。
我们都知道,在工厂方法模式中的每个实际的工厂只定义了一个工厂方法,如果产品种类繁多,并且能进行归类分族的话,那么我们便可以顺理成章的定义多个工厂方法,如此可以避免过多的产品造成工厂泛滥的问题。比如宝驹汽车有轿车、SUV、跑车三个等级的产品,而奔痴汽车也同样包括以上三类等级产品,如此便形成了两个产品族,分别由宝驹工厂和奔痴工厂生产,每个工厂都有三个等级的生产线,以及后加入的四环汽车产品族同样可以符合这个规范模式。
我们以一款即时战略游戏来举例,假设游戏中有两个种族,地球人类与外星异形族,其中人类族拥有各种高科技军工制造技术,而怪兽异形族则是以血肉之躯的不断进化与人类抗衡。
在开始代码之前我们先对两族兵种进行分析归纳,我们看到人类兵工厂和怪兽兵工厂(母巢)产出兵种都可以被简单归纳为初、中、高三个等级,如下表所示。
好了,产品族已经定义清楚了,开始建立数据模型。首先定义产品的父类抽象兵种Unit,这里我们使用抽象类以达到属性延申遗传给子类的目的。
%201public%20abstract%20class%20Unit%20%7B//%20%E5%85%B5%E7%A7%8D%0A%202%0A%203%20%20%20%20protected%20int%20attack;//%20%E6%94%BB%E5%87%BB%E5%8A%9B%0A%204%20%20%20%20protected%20int%20defence;//%20%E9%98%B2%E5%BE%A1%E5%8A%9B%0A%205%20%20%20%20protected%20int%20health;//%20%E8%A1%80%E9%87%8F%0A%206%20%20%20%20protected%20int%20x;//%20%E6%A8%AA%E5%9D%90%E6%A0%87%0A%207%20%20%20%20protected%20int%20y;//%20%E7%BA%B5%E5%9D%90%E6%A0%87%0A%208%0A%209%20%20%20%20public%20Unit(int%20attack,%20int%20defence,%20int%20health,%20int%20x,%20int%20y)%20%7B%0A10%20%20%20%20%20%20%20%20this.attack%20=%20attack;%0A11%20%20%20%20%20%20%20%20this.defence%20=%20defence;%0A12%20%20%20%20%20%20%20%20this.health%20=%20health;%0A13%20%20%20%20%20%20%20%20this.x%20=%20x;%0A14%20%20%20%20%20%20%20%20this.y%20=%20y;%0A15%20%20%20%20%7D%0A16%0A17%20%20%20%20public%20abstract%20void%20show();%0A18%0A19%20%20%20%20public%20abstract%20void%20attack();%0A20%0A21%7D%0A
不管是什么兵种必然会具有攻击力、防御力、血量体力值、坐标方位等等属性,我们都定义为protected以供子类继承,除此之外还有两个抽象方法显示和攻击。接下来是人类的产品族海军陆战队士兵、变形坦克和巨型战舰,它们分别对应初、中、高级兵种。
%201public%20class%20Marine%20extends%20Unit%20%7B//%20%E6%B5%B7%E5%86%9B%E9%99%86%E6%88%98%E9%98%9F%E5%A3%AB%E5%85%B5%0A%202%0A%203%20%20%20%20public%20Marine(int%20x,%20int%20y)%20%7B%0A%204%20%20%20%20%20%20%20%20super(6,%205,%2040,%20x,%20y);%0A%205%20%20%20%20%7D%0A%206%0A%207%20%20%20%20@Override%0A%208%20%20%20%20public%20void%20show()%20%7B%0A%209%20%20%20%20%20%20%20%20System.out.println(%22%E5%A3%AB%E5%85%B5%E5%87%BA%E7%8E%B0%E5%9C%A8%E5%9D%90%E6%A0%87%EF%BC%9A%5B%22%20 %20x%20 %20%22,%22%20 %20y%20 %20%22%5D%22);%0A10%20%20%20%20%7D%0A11%0A12%20%20%20%20@Override%0A13%20%20%20%20public%20void%20attack()%20%7B%0A14%20%20%20%20%20%20%20%20System.out.println(%22%E5%A3%AB%E5%85%B5%E7%94%A8%E6%9C%BA%E5%85%B3%E6%9E%AA%E5%B0%84%E5%87%BB%EF%BC%8C%E6%94%BB%E5%87%BB%E5%8A%9B%EF%BC%9A%22%20 %20attack);%0A15%20%20%20%20%7D%0A16%0A17%7D%0A
%201public%20class%20Tank%20extends%20Unit%20%7B//%20%E5%9D%A6%E5%85%8B%0A%202%0A%203%20%20%20%20public%20Tank(int%20x,%20int%20y)%20%7B%0A%204%20%20%20%20%20%20%20%20super(25,%20100,%20150,%20x,%20y);%0A%205%20%20%20%20%7D%0A%206%0A%207%20%20%20%20@Override%0A%208%20%20%20%20public%20void%20show()%20%7B%0A%209%20%20%20%20%20%20%20%20System.out.println(%22%E5%9D%A6%E5%85%8B%E5%87%BA%E7%8E%B0%E5%9C%A8%E5%9D%90%E6%A0%87%EF%BC%9A%5B%22%20 %20x%20 %20%22,%22%20 %20y%20 %20%22%5D%22);%0A10%20%20%20%20%7D%0A11%0A12%20%20%20%20@Override%0A13%20%20%20%20public%20void%20attack()%20%7B%0A14%20%20%20%20%20%20%20%20System.out.println(%22%E5%9D%A6%E5%85%8B%E7%94%A8%E7%82%AE%E8%BD%B0%E5%87%BB%EF%BC%8C%E6%94%BB%E5%87%BB%E5%8A%9B%EF%BC%9A%22%20 %20attack);%0A15%20%20%20%20%7D%0A16%0A17%7D
%201public%20class%20Battleship%20extends%20Unit%20%7B//%20%E5%B7%A8%E5%9E%8B%E6%88%98%E8%88%B0%0A%202%0A%203%20%20%20%20public%20Battleship(int%20x,%20int%20y)%20%7B%0A%204%20%20%20%20%20%20%20%20super(25,%20200,%20500,%20x,%20y);%0A%205%20%20%20%20%7D%0A%206%0A%207%20%20%20%20@Override%0A%208%20%20%20%20public%20void%20show()%20%7B%0A%209%20%20%20%20%20%20%20%20System.out.println(%22%E6%88%98%E8%88%B0%E5%87%BA%E7%8E%B0%E5%9C%A8%E5%9D%90%E6%A0%87%EF%BC%9A%5B%22%20 %20x%20 %20%22,%22%20 %20y%20 %20%22%5D%22);%0A10%20%20%20%20%7D%0A11%0A12%20%20%20%20@Override%0A13%20%20%20%20public%20void%20attack()%20%7B%0A14%20%20%20%20%20%20%20%20System.out.println(%22%E6%88%98%E8%88%B0%E7%94%A8%E6%BF%80%E5%85%89%E7%82%AE%E6%89%93%E5%87%BB%EF%BC%8C%E6%94%BB%E5%87%BB%E5%8A%9B%EF%BC%9A%22%20 %20attack);%0A15%20%20%20%20%7D%0A16%0A17%7D%0A
可以看到每个兵种的属性值都不同,我们在第4行的构造方法中调用了父类构造,直接赋值给遗传下来的属性,兵种越高攻击防御越高(当然制造成本也更高,这里我们忽略价格),而且都重写了自己的展示和攻击方法,行为差异化,当然也许坦克会具备其他特有的行为比如变形什么的(异形也许会打洞钻地),我们此处依然忽略,保持简约。然后定义外星生物家族的三级兵种,分别是:蟑螂、毒液、猛犸。
%201public%20class%20Roach%20extends%20Unit%20%7B//%20%E5%A4%96%E6%98%9F%E8%9F%91%E8%9E%82%E5%85%B5%0A%202%0A%203%20%20%20%20public%20Roach(int%20x,%20int%20y)%20%7B%0A%204%20%20%20%20%20%20%20%20super(5,%202,%2035,%20x,%20y);%0A%205%20%20%20%20%7D%0A%206%0A%207%20%20%20%20@Override%0A%208%20%20%20%20public%20void%20show()%20%7B%0A%209%20%20%20%20%20%20%20%20System.out.println(%22%E8%9F%91%E8%9E%82%E5%85%B5%E5%87%BA%E7%8E%B0%E5%9C%A8%E5%9D%90%E6%A0%87%EF%BC%9A%5B%22%20 %20x%20 %20%22,%22%20 %20y%20 %20%22%5D%22);%0A10%20%20%20%20%7D%0A11%0A12%20%20%20%20@Override%0A13%20%20%20%20public%20void%20attack()%20%7B%0A14%20%20%20%20%20%20%20%20System.out.println(%22%E8%9F%91%E8%9E%82%E5%85%B5%E7%94%A8%E7%88%AA%E5%AD%90%E6%8C%A0%EF%BC%8C%E6%94%BB%E5%87%BB%E5%8A%9B%EF%BC%9A%22%20 %20attack);%0A15%20%20%20%20%7D%0A16%0A17%7D%0A
%201public%20class%20Spitter%20extends%20Unit%20%7B//%20%E5%A4%96%E6%98%9F%E6%AF%92%E6%B6%B2%E5%8F%A3%E6%B0%B4%E5%85%B5%0A%202%0A%203%20%20%20%20public%20Spitter(int%20x,%20int%20y)%20%7B%0A%204%20%20%20%20%20%20%20%20super(10,%208,%2080,%20x,%20y);%0A%205%20%20%20%20%7D%0A%206%0A%207%20%20%20%20@Override%0A%208%20%20%20%20public%20void%20show()%20%7B%0A%209%20%20%20%20%20%20%20%20System.out.println(%22%E5%8F%A3%E6%B0%B4%E5%85%B5%E5%87%BA%E7%8E%B0%E5%9C%A8%E5%9D%90%E6%A0%87%EF%BC%9A%5B%22%20 %20x%20 %20%22,%22%20 %20y%20 %20%22%5D%22);%0A10%20%20%20%20%7D%0A11%0A12%20%20%20%20@Override%0A13%20%20%20%20public%20void%20attack()%20%7B%0A14%20%20%20%20%20%20%20%20System.out.println(%22%E5%8F%A3%E6%B0%B4%E5%85%B5%E7%94%A8%E6%AF%92%E6%B6%B2%E5%96%B7%E5%B0%84%EF%BC%8C%E6%94%BB%E5%87%BB%E5%8A%9B%EF%BC%9A%22%20 %20attack);%0A15%20%20%20%20%7D%0A16%0A17%7D%0A
%201public%20class%20Mammoth%20extends%20Unit%20%7B//%20%E5%A4%96%E6%98%9F%E7%8C%9B%E7%8A%B8%E5%B7%A8%E5%85%BD%0A%202%0A%203%20%20%20%20public%20Mammoth(int%20x,%20int%20y)%20%7B%0A%204%20%20%20%20%20%20%20%20super(20,%20100,%20400,%20x,%20y);%0A%205%20%20%20%20%7D%0A%206%0A%207%20%20%20%20@Override%0A%208%20%20%20%20public%20void%20show()%20%7B%0A%209%20%20%20%20%20%20%20%20System.out.println(%22%E7%8C%9B%E7%8A%B8%E5%B7%A8%E5%85%BD%E5%85%B5%E5%87%BA%E7%8E%B0%E5%9C%A8%E5%9D%90%E6%A0%87%EF%BC%9A%5B%22%20 %20x%20 %20%22,%22%20 %20y%20 %20%22%5D%22);%0A10%20%20%20%20%7D%0A11%0A12%20%20%20%20@Override%0A13%20%20%20%20public%20void%20attack()%20%7B%0A14%20%20%20%20%20%20%20%20System.out.println(%22%E7%8C%9B%E7%8A%B8%E5%B7%A8%E5%85%BD%E7%94%A8%E7%8D%A0%E7%89%99%E9%A1%B6%EF%BC%8C%E6%94%BB%E5%87%BB%E5%8A%9B%EF%BC%9A%22%20 %20attack);%0A15%20%20%20%20%7D%0A16%0A17%7D%0A
没什么好说的,大同小异。重点来了,接下来是我们的抽象工厂,概括出三个等级兵种的标准制造方法,我们这里以接口来定义它。
1public%20interface%20AbstractFactory%20%7B%0A2%0A3%20%20%20%20public%20Unit%20createLowClass();//%20%E5%B7%A5%E5%8E%82%E6%96%B9%E6%B3%95%EF%BC%9A%E5%88%B6%E9%80%A0%E4%BD%8E%E7%BA%A7%E5%85%B5%E7%A7%8D%0A4%0A5%20%20%20%20public%20Unit%20createMidClass();//%20%E5%B7%A5%E5%8E%82%E6%96%B9%E6%B3%95%EF%BC%9A%E5%88%B6%E9%80%A0%E4%B8%AD%E7%BA%A7%E5%85%B5%E7%A7%8D%0A6%0A7%20%20%20%20public%20Unit%20createHighClass();//%20%E5%B7%A5%E5%8E%82%E6%96%B9%E6%B3%95%EF%BC%9A%E5%88%B6%E9%80%A0%E9%AB%98%E7%BA%A7%E5%85%B5%E7%A7%8D%0A8%7D%0A
可以看到,三个等级的接口意味着子类具体工厂必须具备初、中、高级三条生产线,它们同属一个家族,或者说是一个品牌的不同型号系列。理解了这一点后我们可以开始定义人类兵工厂的实现。
%201public%20class%20HumanFactory%20implements%20AbstractFactory%7B%0A%202%0A%203%20%20%20%20//%E4%BA%BA%E6%97%8F%E5%B7%A5%E5%8E%82%E5%9D%90%E6%A0%87%0A%204%20%20%20%20private%20int%20x;%0A%205%20%20%20%20private%20int%20y;%0A%206%0A%207%20%20%20%20public%20HumanFactory(int%20x,%20int%20y)%20%7B%0A%208%20%20%20%20%20%20%20%20this.x%20=%20x;%0A%209%20%20%20%20%20%20%20%20this.y%20=%20y;%0A10%20%20%20%20%7D%0A11%0A12%20%20%20%20@Override%0A13%20%20%20%20public%20Unit%20createLowClass()%20%7B%0A14%20%20%20%20%20%20%20%20Unit%20unit%20=%20new%20Marine(x,%20y);%0A15%20%20%20%20%20%20%20%20System.out.println(%22%E5%88%B6%E9%80%A0%E6%B5%B7%E5%86%9B%E9%99%86%E6%88%98%E9%98%9F%E5%91%98%E6%88%90%E5%8A%9F%E3%80%82%22);%0A16%20%20%20%20%20%20%20%20return%20unit;%0A17%20%20%20%20%7D%0A18%0A19%20%20%20%20@Override%0A20%20%20%20%20public%20Unit%20createMidClass()%20%7B%0A21%20%20%20%20%20%20%20%20Unit%20unit%20=%20new%20Tank(x,%20y);%0A22%20%20%20%20%20%20%20%20System.out.println(%22%E5%88%B6%E9%80%A0%E5%8F%98%E5%BD%A2%E5%9D%A6%E5%85%8B%E6%88%90%E5%8A%9F%E3%80%82%22);%0A23%20%20%20%20%20%20%20%20return%20unit;%0A24%20%20%20%20%7D%0A25%0A26%20%20%20%20@Override%0A27%20%20%20%20public%20Unit%20createHighClass()%20%7B%0A28%20%20%20%20%20%20%20%20Unit%20unit%20=%20new%20Battleship(x,%20y);%0A29%20%20%20%20%20%20%20%20System.out.println(%22%E5%88%B6%E9%80%A0%E5%B7%A8%E5%9E%8B%E6%88%98%E8%88%B0%E6%88%90%E5%8A%9F%E3%80%82%22);%0A30%20%20%20%20%20%20%20%20return%20unit;%0A31%20%20%20%20%7D%0A32%0A33%7D%0A
可以看到,这个兵工厂实现了人类兵种产品族的制造方法,分别对应三个等级兵种的制造方法,注意第14行的坐标初始化意思是在工厂的坐标位置上出兵。接下来是异形母巢的工厂实现。
%201public%20class%20AlienFactory%20implements%20AbstractFactory%7B%0A%202%0A%203%20%20%20%20//%E5%A4%96%E6%98%9F%E8%99%AB%E6%97%8F%E5%B7%A5%E5%8E%82%E5%9D%90%E6%A0%87%0A%204%20%20%20%20private%20int%20x;%0A%205%20%20%20%20private%20int%20y;%0A%206%0A%207%20%20%20%20public%20AlienFactory(int%20x,%20int%20y)%20%7B%0A%208%20%20%20%20%20%20%20%20this.x%20=%20x;%0A%209%20%20%20%20%20%20%20%20this.y%20=%20y;%0A10%20%20%20%20%7D%0A11%0A12%20%20%20%20@Override%0A13%20%20%20%20public%20Unit%20createLowClass()%20%7B%0A14%20%20%20%20%20%20%20%20Unit%20unit%20=%20new%20Roach(x,%20y);%0A15%20%20%20%20%20%20%20%20System.out.println(%22%E5%88%B6%E9%80%A0%E8%9F%91%E8%9E%82%E5%85%B5%E6%88%90%E5%8A%9F%E3%80%82%22);%0A16%20%20%20%20%20%20%20%20return%20unit;%0A17%20%20%20%20%7D%0A18%0A19%20%20%20%20@Override%0A20%20%20%20%20public%20Unit%20createMidClass()%20%7B%0A21%20%20%20%20%20%20%20%20Unit%20unit%20=%20new%20Spitter(x,%20y);%0A22%20%20%20%20%20%20%20%20System.out.println(%22%E5%88%B6%E9%80%A0%E6%AF%92%E6%B6%B2%E5%85%B5%E6%88%90%E5%8A%9F%E3%80%82%22);%0A23%20%20%20%20%20%20%20%20return%20unit;%0A24%20%20%20%20%7D%0A25%0A26%20%20%20%20@Override%0A27%20%20%20%20public%20Unit%20createHighClass()%20%7B%0A28%20%20%20%20%20%20%20%20Unit%20unit%20=%20new%20Mammoth(x,%20y);%0A29%20%20%20%20%20%20%20%20System.out.println(%22%E5%88%B6%E9%80%A0%E7%8C%9B%E7%8A%B8%E5%B7%A8%E5%85%BD%E6%88%90%E5%8A%9F%E3%80%82%22);%0A30%20%20%20%20%20%20%20%20return%20unit;%0A31%20%20%20%20%7D%0A32%0A33%7D%0A
显而易见,同样地分三级制造异形家族的产品系列,工厂准备完毕可以造兵打架了,运行游戏客户端。
%201public%20class%20Client%20%7B%0A%202%20%20%20%20public%20static%20void%20main(String%5B%5D%20args)%20%7B%0A%203%20%20%20%20%20%20%20%20System.out.println(%22%E6%B8%B8%E6%88%8F%E5%BC%80%E5%A7%8B%E3%80%82%E3%80%82%E3%80%82%22);%0A%204%20%20%20%20%20%20%20%20System.out.println(%22%E5%8F%8C%E6%96%B9%E6%8C%96%E7%9F%BF%E6%94%92%E9%92%B1%E3%80%82%E3%80%82%E3%80%82%22);%0A%205%0A%206%20%20%20%20%20%20%20%20//%E7%AC%AC%E4%B8%80%E4%BD%8D%E7%8E%A9%E5%AE%B6%E9%80%89%E6%8B%A9%E4%BA%86%E5%9C%B0%E7%90%83%E4%BA%BA%E6%97%8F%0A%207%20%20%20%20%20%20%20%20System.out.println(%22%E5%B7%A5%E4%BA%BA%E5%BB%BA%E9%80%A0%E4%BA%BA%E6%97%8F%E5%B7%A5%E5%8E%82%E3%80%82%E3%80%82%E3%80%82%22);%0A%208%20%20%20%20%20%20%20%20AbstractFactory%20factory%20=%20new%20HumanFactory(10,%2010);%0A%209%0A10%20%20%20%20%20%20%20%20Unit%20marine%20=%20factory.createLowClass();%0A11%20%20%20%20%20%20%20%20marine.show();%0A12%0A13%20%20%20%20%20%20%20%20Unit%20tank%20=%20factory.createMidClass();%0A14%20%20%20%20%20%20%20%20tank.show();%0A15%0A16%20%20%20%20%20%20%20%20Unit%20ship%20=%20factory.createHighClass();%0A17%20%20%20%20%20%20%20%20ship.show();%0A18%0A19%20%20%20%20%20%20%20%20//%E5%8F%A6%E4%B8%80%E4%BD%8D%E7%8E%A9%E5%AE%B6%E9%80%89%E6%8B%A9%E4%BA%86%E5%A4%96%E6%98%9F%E6%97%8F%0A20%20%20%20%20%20%20%20%20System.out.println(%22%E5%B7%A5%E8%9C%82%E5%BB%BA%E9%80%A0%E5%A4%96%E6%98%9F%E8%99%AB%E6%97%8F%E5%B7%A5%E5%8E%82%E3%80%82%E3%80%82%E3%80%82%22);%0A21%20%20%20%20%20%20%20%20factory%20=%20new%20AlienFactory(200,%20200);%0A22%0A23%20%20%20%20%20%20%20%20Unit%20roach%20=%20factory.createLowClass();%0A24%20%20%20%20%20%20%20%20roach.show();%0A25%0A26%20%20%20%20%20%20%20%20Unit%20spitter%20=%20factory.createMidClass();%0A27%20%20%20%20%20%20%20%20spitter.show();%0A28%0A29%20%20%20%20%20%20%20%20Unit%20mammoth%20=%20factory.createHighClass();%0A30%20%20%20%20%20%20%20%20mammoth.show();%0A31%0A32%20%20%20%20%20%20%20%20System.out.println(%22%E4%B8%A4%E6%97%8F%E5%BC%80%E5%A7%8B%E5%A4%A7%E6%B7%B7%E6%88%98%E3%80%82%E3%80%82%E3%80%82%22);%0A33%20%20%20%20%20%20%20%20marine.attack();%0A34%20%20%20%20%20%20%20%20roach.attack();%0A35%20%20%20%20%20%20%20%20spitter.attack();%0A36%20%20%20%20%20%20%20%20tank.attack();%0A37%20%20%20%20%20%20%20%20mammoth.attack();%0A38%20%20%20%20%20%20%20%20ship.attack();%0A39%0A40%20%20%20%20%20%20%20%20/*%0A41%20%20%20%20%20%20%20%20%20%20%20%20%E6%B8%B8%E6%88%8F%E5%BC%80%E5%A7%8B%E3%80%82%E3%80%82%E3%80%82%0A42%20%20%20%20%20%20%20%20%20%20%20%20%E5%8F%8C%E6%96%B9%E6%8C%96%E7%9F%BF%E6%94%92%E9%92%B1%E3%80%82%E3%80%82%E3%80%82%0A43%20%20%20%20%20%20%20%20%20%20%20%20%E5%B7%A5%E4%BA%BA%E5%BB%BA%E9%80%A0%E4%BA%BA%E6%97%8F%E5%B7%A5%E5%8E%82%E3%80%82%E3%80%82%E3%80%82%0A44%20%20%20%20%20%20%20%20%20%20%20%20%E5%88%B6%E9%80%A0%E6%B5%B7%E5%86%9B%E9%99%86%E6%88%98%E9%98%9F%E5%91%98%E6%88%90%E5%8A%9F%E3%80%82%0A45%20%20%20%20%20%20%20%20%20%20%20%20%E5%A3%AB%E5%85%B5%E5%87%BA%E7%8E%B0%E5%9C%A8%E5%9D%90%E6%A0%87%EF%BC%9A%5B10,10%5D%0A46%20%20%20%20%20%20%20%20%20%20%20%20%E5%88%B6%E9%80%A0%E5%8F%98%E5%BD%A2%E5%9D%A6%E5%85%8B%E6%88%90%E5%8A%9F%E3%80%82%0A47%20%20%20%20%20%20%20%20%20%20%20%20%E5%9D%A6%E5%85%8B%E5%87%BA%E7%8E%B0%E5%9C%A8%E5%9D%90%E6%A0%87%EF%BC%9A%5B10,10%5D%0A48%20%20%20%20%20%20%20%20%20%20%20%20%E5%88%B6%E9%80%A0%E5%B7%A8%E5%9E%8B%E6%88%98%E8%88%B0%E6%88%90%E5%8A%9F%E3%80%82%0A49%20%20%20%20%20%20%20%20%20%20%20%20%E6%88%98%E8%88%B0%E5%87%BA%E7%8E%B0%E5%9C%A8%E5%9D%90%E6%A0%87%EF%BC%9A%5B10,10%5D%0A50%20%20%20%20%20%20%20%20%20%20%20%20%E5%B7%A5%E8%9C%82%E5%BB%BA%E9%80%A0%E5%A4%96%E6%98%9F%E8%99%AB%E6%97%8F%E5%B7%A5%E5%8E%82%E3%80%82%E3%80%82%E3%80%82%0A51%20%20%20%20%20%20%20%20%20%20%20%20%E5%88%B6%E9%80%A0%E8%9F%91%E8%9E%82%E5%85%B5%E6%88%90%E5%8A%9F%E3%80%82%0A52%20%20%20%20%20%20%20%20%20%20%20%20%E8%9F%91%E8%9E%82%E5%85%B5%E5%87%BA%E7%8E%B0%E5%9C%A8%E5%9D%90%E6%A0%87%EF%BC%9A%5B200,200%5D%0A53%20%20%20%20%20%20%20%20%20%20%20%20%E5%88%B6%E9%80%A0%E6%AF%92%E6%B6%B2%E5%85%B5%E6%88%90%E5%8A%9F%E3%80%82%0A54%20%20%20%20%20%20%20%20%20%20%20%20%E5%8F%A3%E6%B0%B4%E5%85%B5%E5%87%BA%E7%8E%B0%E5%9C%A8%E5%9D%90%E6%A0%87%EF%BC%9A%5B200,200%5D%0A55%20%20%20%20%20%20%20%20%20%20%20%20%E5%88%B6%E9%80%A0%E7%8C%9B%E7%8A%B8%E5%B7%A8%E5%85%BD%E6%88%90%E5%8A%9F%E3%80%82%0A56%20%20%20%20%20%20%20%20%20%20%20%20%E7%8C%9B%E7%8A%B8%E5%B7%A8%E5%85%BD%E5%85%B5%E5%87%BA%E7%8E%B0%E5%9C%A8%E5%9D%90%E6%A0%87%EF%BC%9A%5B200,200%5D%0A57%20%20%20%20%20%20%20%20%20%20%20%20%E4%B8%A4%E6%97%8F%E5%BC%80%E5%A7%8B%E5%A4%A7%E6%B7%B7%E6%88%98%E3%80%82%E3%80%82%E3%80%82%0A58%20%20%20%20%20%20%20%20%20%20%20%20%E5%A3%AB%E5%85%B5%E7%94%A8%E6%9C%BA%E5%85%B3%E6%9E%AA%E5%B0%84%E5%87%BB%EF%BC%8C%E6%94%BB%E5%87%BB%E5%8A%9B%EF%BC%9A6%0A59%20%20%20%20%20%20%20%20%20%20%20%20%E8%9F%91%E8%9E%82%E5%85%B5%E7%94%A8%E7%88%AA%E5%AD%90%E6%8C%A0%EF%BC%8C%E6%94%BB%E5%87%BB%E5%8A%9B%EF%BC%9A5%0A60%20%20%20%20%20%20%20%20%20%20%20%20%E5%8F%A3%E6%B0%B4%E5%85%B5%E7%94%A8%E6%AF%92%E6%B6%B2%E5%96%B7%E5%B0%84%EF%BC%8C%E6%94%BB%E5%87%BB%E5%8A%9B%EF%BC%9A10%0A61%20%20%20%20%20%20%20%20%20%20%20%20%E5%9D%A6%E5%85%8B%E7%94%A8%E7%82%AE%E8%BD%B0%E5%87%BB%EF%BC%8C%E6%94%BB%E5%87%BB%E5%8A%9B%EF%BC%9A25%0A62%20%20%20%20%20%20%20%20%20%20%20%20%E7%8C%9B%E7%8A%B8%E5%B7%A8%E5%85%BD%E7%94%A8%E7%8D%A0%E7%89%99%E9%A1%B6%EF%BC%8C%E6%94%BB%E5%87%BB%E5%8A%9B%EF%BC%9A20%0A63%20%20%20%20%20%20%20%20%20%20%20%20%E6%88%98%E8%88%B0%E7%94%A8%E6%BF%80%E5%85%89%E7%82%AE%E6%89%93%E5%87%BB%EF%BC%8C%E6%94%BB%E5%87%BB%E5%8A%9B%EF%BC%9A25%20%0A64%20%20%20%20%20%20%20%20%20*/%0A65%20%20%20%20%7D%0A66%7D%0A
这里我们可以看到,不管玩家选择哪个种族,只要替换工厂实现就可以完成不同兵种的制造,假设玩家又需要一个新的种族,依然按照这种模式去实现一个新族工厂就可以了。
至此,我们用各族工厂对种类繁多的产品进行了划分、归类,产品虽然繁多,但总得有品牌、型号之分,以各族工厂和产品线划界,分而治之,横向拆分产品家族,纵向则拆分产品等级。
点击图片加入Spring交流群
↓↓↓
看完本文有收获?请转发分享给更多人
以上数据来源于网络,如有侵权,请联系删除。
评论 (0)