简介:
当每个抽象产品都有多于一个的具体子类的时候,工厂角色怎么知道实例化哪一个子类呢?比如每个抽象产品角色都有两个具体产品。抽象工厂模式提供两个具体工厂角色,分别对应于这两个具体产品角色,每一个具体工厂角色只负责某一个产品角色的实例化。每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例。
每一个模式都是针对一定问题的解决方案,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结构。
1. 定义
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
2. 解决的问题
系统不依赖于产品类实例如何被创建,组合和表达的细节。
系统的产品有多于一个的产品族,而系统只消费其中某一族的产品(抽象工厂模式的原始用意Unix&Windows)Button--->UnixButton/WinButton
Text----->UnixText/WinText
Unix产品族和Windows产品族,不会同时使用。
Factory--->UnixFactory/WinFactory
同属于同一个产品族是在一起使用的。这一约束必须在系统的设计中体现出来。
系统提供一个产品类的库,所有产品以同样的接口出现,从而使客户端不依赖于实现。3. 例子
类图
package build.factory.abstractf;
/**
* @Author: bufoon
* @Email: 285395841@qq.com
* @Datetime: Created In 2018/4/7 9:46
* @Desc: as follows.
* 定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需制定他们的具体类
* 在实际的生产过程中,一件产品大多都是由多个厂商生产,然后再组装到一起的
* 所以一双鞋包括:鞋体,刀架,轮子,内胆,配件等
* 其中我们就以配件来举例
* 配件包括 鞋带,扒扣,能量带等
*/
public interface AbstractFactory {
// 创建鞋带
Lace createLace();
// 创建能量带
EnergyTape createEnergyType();
}
package build.factory.abstractf;
/**
* @Author: bufoon
* @Email: 285395841@qq.com
* @Datetime: Created In 2018/4/7 10:41
* @Desc: as follows.
*
*/
public class BlackFactory implements AbstractFactory {
@Override
public Lace createLace() {
return new BlackLace();
}
@Override
public EnergyTape createEnergyType() {
return new BlackEnergyTape();
}
}
package build.factory.abstractf;
/**
* @Author: bufoon
* @Email: 285395841@qq.com
* @Datetime: Created In 2018/4/7 10:41
* @Desc: as follows.
*
*/
public class RedFactory implements AbstractFactory {
@Override
public Lace createLace() {
return new RedLace();
}
@Override
public EnergyTape createEnergyType() {
return new RedEnergyTape();
}
}
package build.factory.abstractf;
/**
* @Author: bufoon
* @Email: 285395841@qq.com
* @Datetime: Created In 2018/4/7 10:41
* @Desc: as follows.
*
*/
public interface Lace {
String getName();
}
package build.factory.abstractf;
/**
* @Author: bufoon
* @Email: 285395841@qq.com
* @Datetime: Created In 2018/4/7 10:41
* @Desc: as follows.
*
*/
public interface EnergyTape {
String getName();
}
package build.factory.abstractf;
/**
* @Author: bufoon
* @Email: 285395841@qq.com
* @Datetime: Created In 2018/4/7 10:41
* @Desc: as follows.
*
*/
public class RedLace implements Lace {
@Override
public String getName() {
return "红色鞋带";
}
}
package build.factory.abstractf;
/**
* @Author: bufoon
* @Email: 285395841@qq.com
* @Datetime: Created In 2018/4/7 10:41
* @Desc: as follows.
*
*/
public class BlackLace implements Lace {
@Override
public String getName() {
return "黑色鞋带";
}
}
package build.factory.abstractf;
/**
* @Author: bufoon
* @Email: 285395841@qq.com
* @Datetime: Created In 2018/4/7 10:41
* @Desc: as follows.
*
*/
public class RedEnergyTape implements EnergyTape {
@Override
public String getName() {
return "红色能量带";
}
}
package build.factory.abstractf;
/**
* @Author: bufoon
* @Email: 285395841@qq.com
* @Datetime: Created In 2018/4/7 10:41
* @Desc: as follows.
*
*/
public class BlackEnergyTape implements EnergyTape {
@Override
public String getName() {
return "黑色能量带";
}
}
package build.factory.abstractf;
/**
* @Author: bufoon
* @Email: 285395841@qq.com
* @Datetime: Created In 2018/4/7 10:41
* @Desc: as follows.
*
*/
public class AbstractFactoryTest {
public static void main(String[] args) {
AbstractFactory factory = new RedFactory();
System.out.println("生产: " + factory.createLace().getName() + " 和 " + factory.createEnergyType().getName());
factory = new BlackFactory();
System.out.println("生产: " + factory.createLace().getName() + " 和 " + factory.createEnergyType().getName());
}
}
输出:
生产: 红色鞋带 和 红色能量带生产: 黑色鞋带 和 黑色能量带
4. 思考
抽象工厂就是将一组相关的产品族用同一个工厂生成。与工厂方法有点类似包含的关系。