- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在阅读 this article 中的工厂时,我遇到了这两个术语 AbstractFactory 和 ConcreteFactory。
在阅读 StackOverflow 时,我发现了一些很好的答案(如 this SO question),它们讨论了工厂和抽象工厂,但仍然不清楚什么是具体工厂。
所以,我想问:
编辑:在单独的问题 (Abstract Factory vs Concrete factory) 中提出问题 #2,以将这两个讨论分开。
我目前的理解(关于工厂):
// 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);
});
最佳答案
具体工厂是实现抽象工厂的类,可以被实例化。抽象工厂是定义工厂接口(interface)的非实例化类。例如(使用 Java 进行说明),抽象工厂 (FooFactory
) 类似于:
public class Foo {}
public interface FooFactory {
public Foo createFoo() { /* ... */ }
}
因为这个FooFactory
是一个接口(interface)(是抽象的),它不能被实例化。例如,以下将是无效的(并且无法编译):
FooFactory factory = new FooFactory();
具体工厂(在本例中称为 ConcreteFooFactory
)是一个可实例化的类,它实现了 FooFactory
接口(interface):
public class ConcreteFooFactory implements FooFactory {
@Override
public Foo createFoo() { /* ... */ }
}
FooFactory factory = new ConcreteFooFactory();
所有这些都引出了一个问题:为什么要先创建一个抽象工厂,然后再创建一个具体工厂?原因是抽象工厂定义了工厂的接口(interface)(可以调用的方法),而没有定义工厂的任何具体行为。这允许我们创建多个 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 设计模式 : What is a Concrete Factory?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56148079/
我是一名优秀的程序员,十分优秀!