java23种设计模式之九: 抽象工厂方法模式

一.抽象工厂定义

  上一讲我们说了一下工厂方法,那么我们如何对工厂进行抽象。

  因为工厂是生产产品的,现在我们需要工厂抽象,只生产抽象产品,不生产具体的产品,这同时也体现了java的多态。

  现在有2个抽象,一个是抽象工厂,另一个是抽象产品。

  下面介绍抽象产品到具体产品:

  产品的具体实现可以有多种方式,可以有抽象类去实现抽象产品中共有的方法,另一部分交给子类实现,这样,我们就可以把产品一些公有的属性抽象出来,一些

  特有的属性由子类根据自身条件实现,这样就可以有同种功能,不同型号的产品。

  下面介绍抽象工厂到具体工厂:

  抽象工厂是生产产品的,生产具体哪一款产品我们不得而知,但是我们可以通过前面的具体的产品来判断,生产同种类型的产品地方只能是具体类型工厂了,比如

  小米手机工厂只能生产小米手机,苹果手机工厂只生产苹果手机,这样我们就可以有具体的工厂了。下面看2个类型的示例:

//接口
interface Phone{
    //打电话
    void call();
    //发短信
    void sendMsg();
    //品牌
    void brand();
}
//抽象类,只实现部分功能
abstract class AbstractPhone implements Phone{
    
    @Override
    public void call() {
        System.out.println("手机在打电话...");
    }
    @Override
    public void sendMsg() {
        System.out.println("手机在发信息...");
    }
}
//具体实现类1:苹果手机
class ApplePhone extends AbstractPhone{

    @Override
    public void brand() {
        System.out.println("苹果手机");
        this.call();
        this.sendMsg();
    }
    
}
//具体实现类2:小米手机
class XiaoMiPhone extends AbstractPhone{

    @Override
    public void brand() {
        System.out.println("小米手机");
        this.call();
        this.sendMsg();
    }
    
}
//抽象工厂:生产手机
interface PhoneFactory{
    Phone createPhone();
}
//具体工厂1:生产苹果手机
class ApplePhoneFactory implements PhoneFactory{

    @Override
    public Phone createPhone() {
        return new ApplePhone();
    }
}
//具体工厂2:生产小米手机
class XiaoMiFactory implements PhoneFactory{
    @Override
    public Phone createPhone() {
        return new XiaoMiPhone();
    }
}
//接口
interface Human{
    void getColor();
    void talk();
    void getSex();
}
//抽象类,只实现部分功能
abstract class AbstractYellowHuman implements Human{
    @Override
    public void getColor() {
        System.out.println("yellow color...");
    }
    
    @Override
    public void talk() {
        System.out.println("yellow talk...");
    }
}
//具体实现类1:具体实现类会完成父类接口中未完成的方法
class MaleYellowMan extends AbstractYellowHuman{
    @Override
    public void getSex() {
        System.out.println("yellow...male");
    }
}
//具体实现类2:具体实现类会完成父类接口中未完成的方法
class FemaleYellowMan extends AbstractYellowHuman{

    @Override
    public void getSex() {
        System.out.println("yellow...female");
    }
}
//抽象工厂
interface HumanFactory{
    Human createYelloHuman();
}

//具体工厂1:创建男性的工厂
class MaleFactory implements HumanFactory{
    @Override
    public Human createYelloHuman() {
        return new MaleYellowMan();    //创建黄种人,男性角色
    }
}

//具体工厂2:创建女性的工厂
class FemaleFactory implements HumanFactory{
    @Override
    public Human createYelloHuman() {
        return new FemaleYellowMan();
    }
}
原文地址:https://www.cnblogs.com/MrRightZhao/p/11796766.html