抽象工厂
多态工厂利用具体工厂操作具体产品,那么如果需要更多的产品,就会需要更多的具体工厂类,加大了系统的开销。我们可以考虑一种把相关产品的类由同一个具体的工厂所生产,这就是抽象工厂的思想。
使用上一回的多态工厂模式,这将会是一个比较复杂的类图。
产品等级与产品族
(1)产品等级结构(横向):产品的继承结构,比如一个抽象产品是电视机,其子类可能是海尔电视机、海信电视机、TCL电视机,抽象产品和具体品牌构成了一个等级结构,电视机是父类,具体品牌的产品是子类。
(2)产品族(纵向):在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品。比如海尔冰箱、海尔电视机。
抽象工厂概述
提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类,又称为KIT模式,同样是一种创建型模式。
抽象工厂不符合开闭原则,原因在于增加新的产品族将会不需要改变代码就可以实现开闭原则,但是如果新增一个产品等级结构将会是很大的麻烦,这也是抽象工厂模式最大的缺点。要求开发人员在设计之初就对产品等级结构全面考虑,不会在设计完之后的系统中添加新的产品等级结构,也不会删除原来的等级结构,否则在后续的维护工作带来很大麻烦。
sunny公司完美解决方案
代码做了省略,只用了两个产品等级结构
package com.learn.designmode.mode.factory.abstractFactory;
public interface BaseButton {
public void display();
}
class SummerButton implements BaseButton {
@Override
public void display() {
System.out.println("红色按钮");
}
}
class SpringButton implements BaseButton{
@Override
public void display() {
System.out.println("蓝色按钮");
}
}
package com.learn.designmode.mode.factory.abstractFactory;
public interface BaseCombox {
public void display();
}
/**
* spring按钮
*/
class SpringCombox implements BaseCombox{
@Override
public void display() {
System.out.println("蓝色单选");
}
}
class SummerCombox implements BaseCombox{
@Override
public void display() {
System.out.println("红色单选");
}
}
package com.learn.designmode.mode.factory.abstractFactory;
public abstract class BaseFactory {
public abstract BaseButton cerateButton();
public abstract BaseCombox createdCombox();
}
package com.learn.designmode.mode.factory.abstractFactory;
public class SpringFactory extends BaseFactory{
@Override
public BaseButton cerateButton() {
return new SpringButton();
}
@Override
public BaseCombox createdCombox() {
return new SpringCombox();
}
}
package com.learn.designmode.mode.factory.abstractFactory;
public class SummerFactory extends BaseFactory{
@Override
public BaseButton cerateButton() {
return new SummerButton();
}
@Override
public BaseCombox createdCombox() {
return new SummerCombox();
}
}
抽象工厂的总结
优点
(1)抽象工厂隔离了具体类的生成,跟多态工厂一样,由子类实现对产品的实例化,改了具体工厂的行为,某种程度上改变了软件系统的行为。
(2)当一个产品族的多个对象设计成一起工作时,客户端始终调用的是同一个产品族中的对象。
(3)增加产品族不需要改已有的系统,只需要加代码,符合开闭原则。
缺点
(1)增加产品等级结构需要对抽象工厂进行修改,违背开闭原则。
使用场景
(1)一个系统不应当依赖于产品如何被实例创建,组合和表达,用户无需关心对象的创建过程,创建和使用解耦。
(2)系统中有多余一个的产品族,而每次只使用其中的某一产品族,通过配置文件等方式来动态改变产品族,方便增加新的产品族。
(3)属于同一个产品族的产品放在一起使用,同一产品族的产品可以没有任何关系的对象,但是要有一套共同的约束,比如系统控制按钮和复选框。
(4)设计完成后,产品等级结构不需要修改或者添加删除。