设计模式(3)-抽象工厂模式


定义

产品的属性维度通常有两个或以上,通过对产品的属性维度的分解,映射到工厂的维度分解.
可以通过不同的工厂实现获得不同维度结合的产品实例.


示例

女娲造人,产品人不仅有肤色属性,还有性别属性.每个人都是肤色属性和性别属性的合成.通过抽象类将肤色和性别两个属性降维分解,并将工厂的实现降维分解,从而达到可以从不同的工厂获得不同的合成产品.

注:两个属性维度合成一个产品.

抽象产品类先实现获取肤色,再由抽象类的子类实现获取性别.
抽象工厂(或接口)先分解获取不同肤色人类,再由两个不同性别实现工厂分别实现获取肤色人类的方法.
相当于做一个笛卡尔积.


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();
    }

猜你喜欢

转载自www.cnblogs.com/guan-li/p/9881337.html
今日推荐