定义
产品的属性维度通常有两个或以上,通过对产品的属性维度的分解,映射到工厂的维度分解.
可以通过不同的工厂实现获得不同维度结合的产品实例.
示例
女娲造人,产品人不仅有肤色属性,还有性别属性.每个人都是肤色属性和性别属性的合成.通过抽象类将肤色和性别两个属性降维分解,并将工厂的实现降维分解,从而达到可以从不同的工厂获得不同的合成产品.
注:两个属性维度合成一个产品.
抽象产品类先实现获取肤色,再由抽象类的子类实现获取性别.
抽象工厂(或接口)先分解获取不同肤色人类,再由两个不同性别实现工厂分别实现获取肤色人类的方法.
相当于做一个笛卡尔积.
1.人类接口
public interface Human {
void talk();
void getColor();
void getSex();
}
2.不同肤色的抽象产品类
public abstract class YellowHuman implements Human{
@Override
public void talk() {
System.out.println("说话!!!");
}
@Override
public void getColor() {
System.out.println("肤色为黄色!!!");
}
}
public abstract class WhiteHuman implements Human{
@Override
public void talk() {
System.out.println("说话!!!");
}
@Override
public void getColor() {
System.out.println("肤色为白色!!!");
}
}
public abstract class BlackHuman implements Human{
//抽象类实现接口,类似于接口继承接口.可以只实现接口中的部分方法,没有实现的方法作为不显示的抽象方法,由它的子类实现.
@Override
public void talk(){
System.out.println("说话!!!");
}
@Override
public void getColor(){
System.out.println("肤色为黑色!!!");
}
}
3.抽象产品类的实现类
相当于做笛卡尔积
public class MaleYellowHuman extends YellowHuman{
@Override
public void getSex() {
System.out.println("性别为男性!!!");
}
}
public class MaleWhiteHuman extends WhiteHuman{
@Override
public void getSex() {
System.out.println("性别为男性");
}
}
public class MaleBlackHuman extends BlackHuman{
@Override
public void getSex() {
System.out.println("性别为男性!!!");
}
}
public class FemaleYellowHuman extends YellowHuman{
@Override
public void getSex() {
System.out.println("性别为女性!!!");
}
}
public class FemaleWhiteHuman extends WhiteHuman{
@Override
public void getSex() {
System.out.println("性别为女性!!!");
}
}
public class FemaleBlackHuman extends BlackHuman{
@Override
public void getSex() {
System.out.println("性别为女性!!!");
}
}
4.工厂接口
先定义获得不同肤色产品的方法.
public interface HumanFactory {
public Human getYellowHuman();
public Human getWhiteHuman();
public Human getBlackHuman();
}
5.工厂具体实现
定义两个不同性别的工厂实现,实现接口时相当于做笛卡尔积.
public class FemaleHumanFactory implements HumanFactory{
@Override
public YellowHuman getYellowHuman() {
return new FemaleYellowHuman();
}
@Override
public WhiteHuman getWhiteHuman() {
return new FemaleWhiteHuman();
}
@Override
public BlackHuman getBlackHuman() {
return new FemaleBlackHuman();
}
}
public class MaleHumanFactory implements HumanFactory{
@Override
public Human getYellowHuman() {
return new MaleYellowHuman();
}
@Override
public Human getWhiteHuman() {
return new MaleWhiteHuman();
}
@Override
public Human getBlackHuman() {
return new MaleBlackHuman();
}
}
6.运行
public static void main(String[] args) {
MaleHumanFactory mhf = new MaleHumanFactory();
MaleYellowHuman myh = (MaleYellowHuman) mhf.getYellowHuman();
MaleWhiteHuman mwh = (MaleWhiteHuman) mhf.getWhiteHuman();
MaleBlackHuman mbh = (MaleBlackHuman) mhf.getBlackHuman();
myh.talk();
myh.getColor();
myh.getSex();
mwh.talk();
mwh.getColor();
mwh.getSex();
mbh.talk();
mbh.getColor();
mbh.getSex();
}