工厂模式是用来创建产品的,工厂方法模式是用来创建一种产品的,但有时我们会创建一组产品.这就需要用抽象工厂.在抽象中有两个概念需要了解产品族和产品等级结构
产品等级结构:产品的等级结构也就是产品的继承结构.(也就是说是子父类之间的关系,就比如说你有一个抽象类,子类继承这个抽象类那么子类和抽象类之间就构成了产品等级结构)纵向看
产品族:在抽象工厂模式中,由同一个工厂生产的,位于不同等级结构中的一组产品.(可以理解为就是一个抽象类所有的的子类的集合,例如华为生产手机也生产电脑,其中手机作为抽象类,荣耀系列手机,..一系列继承了手机的系列就构成了一个产品族)横向看
其实在这里就可以看出来抽象工厂模式与工厂方法模式的不同之处了,工厂方法模式是生产一个产品族的而抽象工厂模式是用来创建多个产品族
抽象工厂模式与模式与工厂方法模式的结构大致相同抽象工厂模式的结构为1.抽象工厂,2.多个具体的工厂(用来产生不同的产品族),3多个不同的产品抽象类4.具体的产品类具体的代码如下
/**
* <p> 华为的抽象工厂 </p>
*
* @author Alemand
* @since 2018/1/17
*/
public interface HuaweiFactory {
/**
* 生产手机
*
* @param phoneName 要创建什么手机的
* @return 手机
*/
Phone createPhone(String phoneName);
/**
* 生产电脑
*
* @param computerName 电脑的名字
* @return 电脑
*/
Computer createComputer(String computerName);
}
/**
* <p>电脑产品的抽象类 </p>
*
* @author Alemand
* @since 2018/1/17
*/
public interface Computer {
}
/**
* <p> 具体的电脑 </p>
*
* @author Alemand
* @since 2018/1/19
*/
public class MateBook10 implements Computer{
}
/**
* <p> 具体的电脑 </p>
*
* @author Alemand
* @since 2018/1/19
*/
public class MateBook9 implements Computer {
}
/**
* <p> 手机产品的抽象类 </p>
*
* @author Alemand
* @since 2018/1/17
*/
public interface Phone {
}
/**
* <p> 具体的手机 </p>
*
* @author Alemand
* @since 2018/1/19
*/
public class Mate10 implements Phone {
}
/**
* <p> 具体的手机 </p>
*
* @author Alemand
* @since 2018/1/19
*/
public class Mate9 implements Phone {
}
/**
* <p> 具体的电脑工厂 </p>
*
* @author Alemand
* @since 2018/1/19
*/
public class HuaweiComputerFactoryImpl implements HuaweiFactory {
@Override
public Phone createPhone(String phoneName) {
return null;
}
/**
* 生产电脑(里面所有的电脑的具体对象构成电脑产品族)
*
* @param computerName 电脑的名字
* @return 电脑
*/
@Override
public Computer createComputer(String computerName) {
if (computerName.equals("mateBook10")) {
return new MateBook10();
}
if (computerName.equals("mateBook9")) {
return new MateBook9();
}
return null;
}
}
/**
* <p> 具体的手机工厂 </p>
*
* @author Alemand
* @since 2018/1/17
*/
public class HuaweiPhoneFactoryImpl implements HuaweiFactory {
/**
* 创建手机的方法(里面所有的手机的具体对象构成手机产品族)
*
* @return 具体的手机
*/
@Override
public Phone createPhone(String phoneName) {
if (phoneName.equals("mate9")) {
return new Mate9();
}
if (phoneName.equals("mate10")) {
return new Mate10();
}
return null;
}
@Override
public Computer createComputer(String computerName) {
return null;
}
}
抽象工厂的优点:
- 抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易。所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。另外,应用抽象工厂模式可以实现高内聚低耦合的设计目的,因此抽象工厂模式得到了广泛的应用。
- 当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。这对一些需要根据当前环境来决定其行为的软件系统来说,是一种非常实用的设计模式。
- 增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。
抽象工厂的缺点:
- 在添加新的产品对象时,难以扩展抽象工厂来生产新种类的产品,这是因为在抽象工厂角色中规定了所有可能被创建的产品集合,要支持新种类的产品就意味着要对该接口进行扩展,而这将涉及到对抽象工厂角色及其所有子类的修改,显然会带来较大的不便。
- 开闭原则的倾斜性(增加新的工厂和产品族容易,增加新的产品等级结构麻烦)。(开闭原则:对扩展开放,对修改关闭)