软件设计模式——抽象工厂模式

本文深入解析抽象工厂模式,一种创建型设计模式,用于创建一系列相关或相互依赖的对象,而无需指定其具体类。通过实例展示了如何使用抽象工厂模式来创建不同品牌的鼠标和键盘,以及如何轻松扩展以支持更多产品和工厂。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、定义

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

二、解决的问题

如果想创建其他类型的产品,比如除了可以生产鼠标、还可以生产键盘、生产耳机等,就应该考虑采用抽象工厂模式。抽象工厂模式中还便于去创建其他的工厂再去生产这些具体“种类”的产品,比如可以增加一个华硕工厂还可以继续去生产鼠标、键盘和耳机。那么总是会有一个统一的工厂接口,去被继承实现,构造具体的工厂类。所以,个人理解:相比于工厂模式,抽象工厂模式丰富了产品的种类、工厂的种类。便于进行拓展实现。

三、设计类图

抽象工厂模式也就是不仅生产鼠标,同时生产键盘。也就是 PC 厂商是个父类,有生产鼠标,生产键盘两个接口。戴尔工厂,惠普工厂继承它,可以分别生产戴尔鼠标+戴尔键盘,和惠普鼠标+惠普键盘。创建工厂时,由戴尔工厂创建。后续工厂.生产鼠标()则生产戴尔鼠标,工厂.生产键盘()则生产戴尔键盘。

四、代码实现

生产鼠标的接口:

public interface Mouse {
    void sayHi();
}

不同工厂下的鼠标的实现类:

public class HaierMouse implements Mouse {

    @Override
    public void sayHi() {
        System.out.println("Haier Mouse Say Hi");
    }
}
public class HisenseMouse implements Mouse {

    @Override
    public void sayHi() {
        System.out.println("Hisnese Mouse Say Hi.");
    }
}

生产键盘的接口:

public interface KeyBo {
    void sayHi();
}

不同工厂下的键盘的实现类: 

public class HaierKeyBo implements KeyBo {
    @Override
    public void sayHi() {
        System.out.println("Haier KeyBo.");
    }
}
public class HisenseKeyBo implements KeyBo {
    @Override
    public void sayHi() {
        System.out.println("Hisense Key Bo.");
    }
}

抽象工厂去生产鼠标接口和键盘接口:

public abstract class PcFactory {
    /**
     * 创建鼠标
     *
     * @return
     */
    public abstract Mouse createMouse();

    /**
     * 创建键盘
     *
     * @return
     */
    public abstract KeyBo ceateKeyBo();

}

海尔工厂生产鼠标和键盘:

public class HaierFactory extends PcFactory{

    @Override
    public Mouse createMouse() {
        return  new HaierMouse();
    }

    @Override
    public KeyBo ceateKeyBo() {
        return new HaierKeyBo();
    }
}

海信工厂生产鼠标和键盘:

public class HisenseFactory extends PcFactory {
    @Override
    public Mouse createMouse() {
        return new HisenseMouse();
    }
    @Override
    public KeyBo ceateKeyBo() {
        return new HisenseKeyBo();
    }
}

客户端的调用方式:

public class Main {
    public static void main(String[] args) {
        //由海尔工厂创建鼠标和键盘
        PcFactory pcFactory = new HaierFactory();
        pcFactory.createMouse().sayHi();
        pcFactory.ceateKeyBo().sayHi();
        //海信工厂创建鼠标和键盘
        PcFactory pcFactory1 = new HisenseFactory();
        pcFactory1.createMouse().sayHi();
        pcFactory1.ceateKeyBo().sayHi();
    }
}

五、增加工厂

假设我们增加华硕工厂,则我们需要增加华硕工厂,和戴尔工厂一样,继承 PC 厂商。之后创建华硕鼠标,继承鼠标类。创建华硕键盘,继承键盘类即可。

六、增加产品

假设我们增加耳麦这个产品,则首先我们需要增加耳麦这个父类,再加上戴尔耳麦,惠普耳麦这两个子类。之后在PC厂商这个父类中,增加生产耳麦的接口。最后在戴尔工厂,惠普工厂这两个类中,分别实现生产戴尔耳麦,惠普耳麦的功能。 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值