小谈抽象工厂模式与工厂方法,Abstract Factory Pattern and Factory Method

本文探讨了工厂方法模式和抽象工厂模式之间的区别。工厂方法模式通过子类重写来实例化不同对象,而抽象工厂模式则通过组合多个工厂方法在一个工厂对象中实现多种对象的创建。

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

问题:从我所阅读的材料中,我看到:工厂方法模式允许你定义一个方法,这个方法可以创建一个实实在在的商品,但是却隐藏了实现细节,这样客户(client)可以得到产品。我第一个问题是关于抽象工厂:是不是抽象工厂模式只允许你创建一系列对象而不是仅仅一个对象?是不是抽象工厂只会根据你调用的方法返回一个很大的对象,或者许多对象?

第二个问题是,我不是很理解这样一句话:

使用抽象工厂模式,一个类的责任就是实例化另外一个对象,通过组合的方式,而工厂对象使用继承和依赖一个子类去负责对象的实例化

我的理解是:
工厂方法模式有一个创建者(Creator)接口,这个接口会让具体的创建者负责去知道那个具体对象应该被实例化,这是不是意味着用继承去负责处理对象实例化?

回答:

最主要的区别就是,工厂方法是一个单一的方法,而抽象工厂是一个对象。

因为工厂方法只是一个方法,它可以在子类里被重写,因此会有人这么说:

工厂方法使用继承和依赖子类去设计对象的实例化。

这种方法是假设,这个对象在调用它自己的工厂方法。因此,唯一能够改变返回值的就是一个子类。

抽象工厂是一个对象,这个对象有多个工厂方法,所以会有这种说法:

用抽象工厂模式,一个类去通过组合的方式去负责对象的实例化

这里有一个例子,对象A想要创建Foo对象

工厂方法:

class A {
    public void doSomething() {
        Foo f = makeFoo();
        f.whatever();   
    }

    protected Foo makeFoo() {
        return new RegularFoo();
    }
}

class B extends A {
    protected Foo makeFoo() {
        //subclass is overriding the factory method 
        //to return something different
        return new SuperFoo();
    }
}

抽象工厂:

class A {
    private Factory factory;

    public A(Factory factory) {
        this.factory = factory;
    }

    public void doSomething() {
        //The concrete class of "f" depends on the concrete class
        //of the factory passed into the constructor. If you provide a
        //different factory, you get a different Foo object.
        Foo f = factory.makeFoo();
        f.whatever();
    }
}

interface Factory {
    Foo makeFoo();
    Bar makeBar();
    Aycufcn makeAmbiguousYetCommonlyUsedFakeClassName();
}

//need to make concrete factories that implement the "Factory" interface here
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值