网站建设顶部图片,开封建设网站,最近五天的新闻大事,高品质的佛山网站建设Abstract Factory#xff0c;把英文直接翻译过来的话就是“抽象工厂”#xff0c;既然是工厂#xff0c;那就肯定是生产产品的地方。不过#xff0c;它不是生产同一类的产品#xff0c;而是生产同一系列的产品。举个例子#xff0c;广州本田现在生产3种汽车#xff0c;O…Abstract Factory把英文直接翻译过来的话就是“抽象工厂”既然是工厂那就肯定是生产产品的地方。不过它不是生产同一类的产品而是生产同一系列的产品。举个例子广州本田现在生产3种汽车Odyssey、Accord、Fit而广本的工厂里面并不是拥有3条不同的生产线以生产不同的汽车。这就非常相似于我们正在讨论的抽象工厂模式广本在生产不同的汽车时需要在各个生产环节进行修改换机器自然是不合适的因为这3种汽车每天都要生产分时段而已。如果某一个环节的更换工作出了问题都会有大麻烦比如Fit的车顶肯定装不到Odyssey上。我们在软件设计的时候也是这样如果需要某一系列配套的类来进行工作当这个系列中有一个类用错了后果都是不好的。再回到广本的例子上当广本准备生产另外一种汽车时只需要拥有相应的配套模具还有其他的一些配件和一些数控设备的控制程序就可以了没有必要搞一大堆的生产线。 再来一个生活中的例子西服西裤皮鞋白衬衫领带头发梳得顺顺的出入高级会所或者重要场合的时候男人一般都这样穿休闲装运动鞋随意的发型生活中就这样穿舒服睡衣拖鞋鸡窝头早上就这样。每一种都是合适的造型如果你搞成如下这样的造型就不合适了西服西裤回力鞋超级大背包鸡窝头广州火车站很多同志都是这样打扮的。 抽象工厂模式是一种创建型的模式。上面的比喻说明了抽象工厂就是生产同一个系列产品的东西因为这一系列的产品是关联的如果混用就可能出问题所以就统一的在抽象工厂中进行创建。当要增加一个新的产品系列时就多写一个工厂子类并添加相应的产品子类就可以了。 我们来看一个类图。 图中我们可以看到客户需要得到某系列的产品的时候直接用相应的工厂子类来创建产品就可以了。比如当需要生产Fit时就用FitFactory等到换班之后要生产Odyssey了直接使用OdysseyFactory替换FitFactory就行了至于怎么替换就随便了GoF也给了我们一些建议我将在后面总结创建型模式的时候讲。 把上面的类图转换成代码应该是这个样子。 关于车门的类 public abstract class AbstractDoor { } public class FitDoor : AbstractDoor { } public class OdysseyDoor : AbstractDoor { } 关于底盘的类 public abstract class AbstractChassis { } public class FitChassis : AbstractChassis { } public class OdysseyChassis : AbstractChassis { } 关于工厂的类 public abstract class HondaFactory { public abstract AbstractDoor CreateDoor(); public abstract AbstractChassis CreateChassis(); } public class FitFactory { public AbstractDoor CreateDoor() { return new FitDoor(); } public AbstractChassis CreateChassis() { return new FitChassis(); } } public class OdysseyFactory { public AbstractDoor CreateDoor() { return new OdysseyDoor(); } public AbstractChassis CreateChassis() { return new OdysseyChassis(); } } 客户的调用 public class Client { private AbstractDoor _door; private AbstractChassis _chassis; private HondaFactory _factory; public void GetACar(string seriesName) { this.PrepareFactory(seriesName); this._door this._factory.CreateDoor(); this._chassis this._factory.CreateChassis(); // TODO: Make a car! } private void PrepareFactory(string seriesName) { switch(seriesName) { case Fit: this._factory new FitFactory(); break; case Odyssey: this._factory new OdysseyFactory(); break; } } } 抽象工厂的优点很明显了就是在需要用到一系列相关类的地方它可以使我们不出错的创建出一系列的类实例而我们在需要添加新的产品系列的时候完全不需要考虑其他系列的问题仅需要将相关的抽象类工厂已经产品具体化就可以了。缺点也在这个地方当工厂需要生产多一种产品不是系列的时候改动将波及所有类比如广本打算在每一辆汽车上装一个翅膀那就需要在工厂中添加一个冲压机以及各种车型的翅膀模具还要在焊接科里添加这么一道工序涂装科以及总装科里面也一样要进行相应的调整。 工厂子类不一定需要实现父类的所有方法但要使子类有用的话我们必须使它的所有方法宣布具体化。这里就引出几种做法1、工厂父类可以就是一个接口以确保其子类一定是具体的2、我们可以继承抽象的父类但不完全具体化这样可以继续细分工厂子类3、抽象的父类中含有具体的方法这些方法也可以不加virtual修饰符。最后的这种方法可能是比较灵活一点的。 抽象工厂主要是用在需要一系列相关联的类协同工作的地方而且这些系列的数量可能会变多每一个系列完成的工作都不一样但是调用接口却是一样的。另外抽象工厂不适合这样一种情况即每个系列内部的元素数量不能够确定也就是说当初设计的时候系列中有3个配件后面又涨成5个之后又涨到7个这样的话要改动的地方将多到让人受不了。 回到目录上一篇引子下一篇Builder 转载于:https://www.cnblogs.com/Reeezak/archive/2005/10/23/260493.html