抽象工厂模式

在前面我们讲述了工厂方法模式,以女娲造人为例,我们有了黄 黑 白 三个肤色的人,但是正常我们又分为男人和女人。那么怎么改造能让我们能分别制造出黄黑白的男人和女人呢。
在这里插入图片描述
接下来是具体代码案例:

  • 人类接口
/**
 * 人类接口
 */
public interface Human {
    void getColor();

    void talk();

    void getSex();
}

  • 然后人类有三个抽象类,分别代表了黑 黄 白种人
public abstract class AbstractBlackHuman implements Human {
    @Override
    public void getColor() {
        System.out.println("黑色皮肤");
    }

    @Override
    public void talk() {
        System.out.println("黑色人会说话");
    }
}


public abstract class AbstractWhiteHuman implements Human {
    @Override
    public void getColor() {
        System.out.println("白色皮肤");
    }

    @Override
    public void talk() {
        System.out.println("白色人会说话");
    }
}

public abstract class AbstractYellowHuman implements Human {
    @Override
    public void getColor() {
        System.out.println("黄色皮肤");
    }

    @Override
    public void talk() {
        System.out.println("黄色人会说话");
    }
}

  • 然后每个抽象类都有两个实现类,分别对应的男人和女人
public class FemaleBlackHuman extends AbstractBlackHuman {
    @Override
    public void getSex() {
        System.out.println("黑色女人");
    }
}

public class MaleBlackHuman extends AbstractBlackHuman {
    @Override
    public void getSex() {
        System.out.println("男性黑人");
    }
}

public class FemaleWhiteHuman extends AbstractWhiteHuman {
    @Override
    public void getSex() {
        System.out.println("女性白人");
    }
}
public class MaleWhiteHuman extends AbstractWhiteHuman {
    @Override
    public void getSex() {
        System.out.println("男性白人");
    }
}
public  class FemaleYellowHuman extends AbstractYellowHuman{

    @Override
    public void getSex() {
        System.out.println("黄色女性");
    }
}

public  class MaleYellowHuman extends AbstractYellowHuman {

    @Override
    public void getSex() {
        System.out.println("黄色男性");
    }

}

  • 接下来就是通过工厂来造人,我们需要两个工厂来分别创建男性和女性
public interface HumanFactory {
    Human createYellowHuman();
    Human createWhiteHuman();
    Human createBlackHuman();
}

public class FemaleFactory implements HumanFactory {
    @Override
    public Human createYellowHuman() {
        return new FemaleYellowHuman();
    }

    @Override
    public Human createWhiteHuman() {
        return new FemaleWhiteHuman();
    }

    @Override`在这里插入代码片`
    public Human createBlackHuman() {
        return new FemaleBlackHuman();
    }
}

public class MaleFactory implements HumanFactory {
    @Override
    public Human createYellowHuman() {
        return new MaleYellowHuman();
    }

    @Override
    public Human createWhiteHuman() {
        return new MaleWhiteHuman();
    }

    @Override
    public Human createBlackHuman() {
        return new MaleBlackHuman();
    }
}
  • 最后就是通过工厂开始造人了:
 public static void main(String[] args) {
        MaleFactory factory = new MaleFactory();
        Human blackHuman = factory.createBlackHuman();
        blackHuman.talk();
        blackHuman.getColor();
        blackHuman.getSex();
        Human whiteHuman = factory.createWhiteHuman();
        whiteHuman.talk();
        whiteHuman.getColor();
        whiteHuman.getSex();
        Human yellowHuman = factory.createYellowHuman();
        yellowHuman.talk();
        yellowHuman.getColor();
        yellowHuman.getSex();

        FemaleFactory femalFactory = new FemaleFactory();
        Human blackHuman1 = femalFactory.createBlackHuman();
        blackHuman1.talk();
        blackHuman1.getColor();
        blackHuman1.getSex();
        Human whiteHuman1 = femalFactory.createWhiteHuman();
        whiteHuman1.talk();
        whiteHuman1.getColor();
        whiteHuman1.getSex();
        Human yellowHuman1 = femalFactory.createYellowHuman();
        yellowHuman1.talk();
        yellowHuman1.getColor();
        yellowHuman1.getSex();
    }
  • 抽象工厂模式的定义
    其定义如下:为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们 的具体类。
    抽象工厂模式的通用类图如图
    在这里插入图片描述
    抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象 工厂模式产生需要的对象是一种非常好的解决方式。我们来看看抽象工厂的通用源代码,首 先有两个互相影响的产品线(也叫做产品族),例如制造汽车的左侧门和右侧门,这两个应 该是数量相等的——两个对象之间的约束,每个型号的车门都是不一样的,这是产品等级结 构约束的,我们先看看两个产品族的类图
    在这里插入图片描述
    其源代码如下:
/**
 * 抽象产品类
 */
public abstract class AbstractProductA {
    public void shareMethod(){

    }

    public abstract void doSomething();
}

public abstract class AbstractProductB {
    public void shareMethon() {
        System.out.println("B产品公共方法");
    }

    public abstract void doSomething();

}

抽象产品实现类

public  class ProductA1 extends AbstractProductA{

    @Override
    public void doSomething() {
        System.out.println("产品A1实现方法");
    }
}
public class ProductA2 extends AbstractProductA {

    @Override
    public void doSomething() {
        System.out.println("产品A2实现方法");
    }
}

public class ProductB1 extends AbstractProductB {
    @Override
    public void doSomething() {
        System.out.println("B1产品实现方法");
    }
}
public class ProductB2 extends AbstractProductB {
    @Override
    public void doSomething() {
        System.out.println("B2产品实现方法");
    }
}

抽象工厂类

public abstract class AbstractCreator {

    abstract AbstractProductA createProductA();

    abstract AbstractProductB createProductB();

}

产品等级实现类

/**
 * 只生产等级为1 的产品
 */
public class Creator1 extends AbstractCreator {
    @Override
    AbstractProductA createProductA() {
        return new ProductA1();
    }

    @Override
    AbstractProductB createProductB() {
        return new ProductB1();
    }
}

/**
 * 只生产等级为2 的产品
 */
public class Creator2 extends AbstractCreator {
    @Override
    AbstractProductA createProductA() {
        return new ProductA2();
    }

    @Override
    AbstractProductB createProductB() {
        return new ProductB2();
    }
}

调用方式

public class Test {
    public static void main(String[] args) {
        Creator1 creator1 = new Creator1();
        creator1.createProductA();
        creator1.createProductB();

        Creator2 creator2 = new Creator2();
        creator2.createProductA();
        creator2.createProductB();
    }
}
  • 抽象工厂模式的应用
    优点:封装性、产品族内约束为非公开装备
    缺点:扩展困难,违反了开闭原则。如果增加产品,从产品到工厂都需要增加。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值