场景1
设计一个可以创建不同几何图形(Shape),如Circle,Rectangle,Triangle等绘图工具类,每个几何图形均具有绘制Draw()和擦除Erase()两个方法
要求在绘制不支持的几何图形时,抛出一个UnsuppShapeException异常,
可应用简单工厂模式, 因为实现相同的接口Shape。
简单工厂的优点:
1.不需要关心类的创建细节。
2.减轻类之间的耦合依赖,具体类的实现只是依赖于简单工厂,而不依赖其他类。
简单工厂的缺点:
1.扩展复杂,当简单工厂需要生产出另外一种产品的时候,需要扩展工厂的内部创建逻辑,比较有可能引起较大的故障
2.由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中
场景2
我现在需要一瓶可乐,有可口可乐公司生产的可乐也有百事可乐公司生产的可乐,那么对于可乐这个产品等级(抽象工厂中会具体说明),具体生产什么可乐并不是在一个工厂实现,而是由一个可乐工厂指定一个标准(接口里面的抽象方法),可口可乐公司百事可乐公司只要按照这个标准去生产就可以了。
可应用工厂方法模式。
工厂方法的定义是:定义一个创建对象的接口,让实现这个接口的的类去决定实例化具体的类。工厂方法让类的实例化推迟到实现接口的子类中进行。
抽象工厂是提供了创建一系列服务的的对象的接口。那么问题就来了,怎么区分和工厂方法中的服务对象呢?
此时就需要对一组概念有所理解,即产品等级和产品族,
我们可以通过横向和纵向的比较,
横向是某一个手机厂商如苹果,小米等,
他们不仅仅生产手机,还生产电脑,耳机等一系类产品,
那么我们把苹果,小米,华为这样的厂商可以认为他们生产的是一个产品族,
而他们自己本身就是一个抽象工厂的具体实现;那么纵向来看,不管是小米华为还是苹果,他们生产的产品是按照一定的规则来生产,显示屏,电池,处理器等等,所以对于纵向的产品来说,他们又是属于同一个产品等级,我们亦可以称他们的实现为工厂方法。
综上所述,抽象工厂解决的是横向的产品族(同一个工厂能生产哪些产品),工厂方法解决的是纵向的产品等级(不同工厂生产同一类产品)。
策略模式,
代替if else, 找到合适的方式到达终点,根据情况适应需求的不断变化,
实现方式 策略接口和策略选择类
根据不同的情况,选择不同的策略,不是简单的if else ,代表这和环境的一种关系