JavaScript 设计模式:啥是具体工厂?

Posted

技术标签:

【中文标题】JavaScript 设计模式:啥是具体工厂?【英文标题】:JavaScript Design Patterns: What is a Concrete Factory?JavaScript 设计模式:什么是具体工厂? 【发布时间】:2019-05-15 11:16:50 【问题描述】:

在阅读 this article 中有关工厂的信息时,我遇到了 AbstractFactoryConcreteFactory 这两个术语。

在阅读 *** 时,我发现了一些关于工厂和抽象工厂的好答案(例如 this SO question),但仍然不清楚具体工厂是什么。

所以,我想问一下:

    什么是混凝土工厂? 它与抽象工厂有何不同?

编辑:在单独的问题 (Abstract Factory vs Concrete factory) 中提出问题 #2,以使这两个讨论分开。


我目前的理解(关于工厂):

在高层次上,我理解,工厂指的是返回全新 something 的方法(可以是任何东西、对象、方法、任何我们需要的东西),我们称之为工厂。在这里,如果我错了,请纠正我。 工厂封装对象创建并将其与其余代码分开。下面是一个例子来说明这一点:

// This function is a factory. When called, creates and returns a new object every time
function ourFactoryFn (firstName, lastName) 
    var a = 
        prop1:  firstName,
        prop2: lastName,
        prop3: firstName + ' ' + lastName + ' says Hello world!'
    
    return a;
;

// Now, let's use our factory to produce new objects
// let's actually have an example to treat it like real life factories :P
var inputArr = [
    firstName: 'Barack', lastName: 'Obama',
    firstName: 'Narendra', lastName: 'Modi',
    firstName: 'Mike', lastName: 'Tyson',
    firstName: 'Mahatma', lastName: 'Gandhi',
    firstName: 'Donald', lastName: 'Trump',
    firstName: 'Priyanka', lastName: 'Chopra'
];
var outputArr = [];
inputArr.forEach(function (x) 
    var newObj = ourFactoryFn(x.firstName, x.lastName); // we used our factory
    console.dir(newObj); // print the freshly created object
    outputArr.push(newObj);
);

【问题讨论】:

我不明白为什么这被否决了......这个问题足够可靠并且格式很好...... 【参考方案1】:

具体工厂是实现抽象工厂的类,可以实例化。抽象工厂是一个不可实例化的类,它定义了工厂的接口。例如(使用 Java 进行说明),抽象工厂 (FooFactory) 将类似于:

public class Foo 

public interface FooFactory 
    public Foo createFoo()  /* ... */ 

因为这个FooFactory 是一个接口(是抽象的),所以它不能被实例化。例如,以下内容将无效(并且无法编译):

FooFactory factory = new FooFactory();

具体工厂(在本例中称为ConcreteFooFactory)是实现FooFactory 接口的可实例化类:

public class ConcreteFooFactory implements FooFactory 

    @Override
    public Foo createFoo()  /* ... */ 


FooFactory factory = new ConcreteFooFactory();

所有这些都引出了一个问题:为什么要创建一个抽象工厂,然后再创建一个具体工厂?原因是抽象工厂定义了工厂的接口(可以调用的方法),而没有定义工厂的任何具体行为。这允许我们创建多个FooFactory 实现(具体类),每个都有不同的特定行为。依赖于工厂的客户端可以依赖于抽象工厂,而其行为可以根据传递给它的具体工厂而改变:

public class BlueFooFactory implements FooFactory 

    @Override
    public Foo createFoo()  /* ...create blue Foo... */ 


public class RedFooFactory implements FooFactory 

    @Override
    public Foo createFoo()  /* ...create red Foo... */ 


public class FooClient 

    private FooFactory factory;

    public FooClient(FooFactory factory) 
        this.factory = factory;
    

    public void doSomething() 
        Foo someFoo = factory.createFoo();
        // ...do something with someFoo...
    


// Option 1
FooClient client = new FooClient(new BlueFooFactory());

// Option 2
FooClient client = new FooClient(new RedFooFactory());

虽然这些示例是用 Java 完成的,但它们也可以用 javascript 完成。请参阅Object-oriented JavaScript: A Deep Dive into ES6 Classes 了解更多信息。

【讨论】:

以上是关于JavaScript 设计模式:啥是具体工厂?的主要内容,如果未能解决你的问题,请参考以下文章

Java中啥是适配器模式及其作用是啥??

JavaScript设计模式--简单工厂模式

使用javascript完成一个简单工厂设计模式。

JavaScript 设计模式之工厂模式

Javascript设计模式第二课 神奇的魔术师——简单工厂模式

深入理解JavaScript系列(28):设计模式之工厂模式