JavaScript设计模式:什么是混凝土工厂?
当我在读有关工厂的书时,我遇到了这两个术语抽象工厂和具体工厂 在阅读StackOverflow时,我找到了一些很好的答案(比如)关于工厂和抽象工厂,但仍然不清楚具体工厂是什么 所以,我想问:JavaScript设计模式:什么是混凝土工厂?,javascript,design-patterns,Javascript,Design Patterns,当我在读有关工厂的书时,我遇到了这两个术语抽象工厂和具体工厂 在阅读StackOverflow时,我找到了一些很好的答案(比如)关于工厂和抽象工厂,但仍然不清楚具体工厂是什么 所以,我想问: 什么是混凝土工厂 它与抽象工厂有何不同 编辑:在单独的问题()中提出问题#2,以使这两个讨论保持分开 到目前为止我的理解(关于工厂): 在高层,我理解工厂指的是一个方法,它返回一个全新的东西(可以是任何东西,一个对象,一个方法,我们需要的任何东西),我们称之为工厂。这里,如果我错了,请纠正我 工厂封装
到目前为止我的理解(关于工厂):
- 在高层,我理解工厂指的是一个方法,它返回一个全新的东西(可以是任何东西,一个对象,一个方法,我们需要的任何东西),我们称之为工厂。这里,如果我错了,请纠正我李>
- 工厂封装并将对象创建与代码的其余部分分开。下面是一个例子来说明同样的情况:
//此函数是一个工厂。调用时,每次都创建并返回一个新对象
函数ourFactoryFn(firstName,lastName){
变量a={
建议1:名字,
建议2:姓氏,
prop3:firstName+“”+lastName+”向世界问好
}
返回a;
};
//现在,让我们用我们的工厂来生产新产品
//让我们举个例子,把它当作现实生活中的工厂:P
变量inputArr=[
{姓:'巴拉克',姓:'奥巴马'},
{firstName:'Narendra',lastName:'Modi'},
{姓:“迈克”,姓“泰森”},
{名字:'圣雄教',姓氏:'甘地'},
{姓:“唐纳德”,姓“特朗普”},
{姓:'Priyanka',姓:'Chopra'}
];
var outputArr=[];
inputArr.forEach(函数(x){
var newObj=ourFactoryFn(x.firstName,x.lastName);//我们使用了我们的工厂
console.dir(newObj);//打印新创建的对象
输出推力(newObj);
});代码>A具体工厂是一个实现了抽象工厂并可以实例化的类。抽象工厂是定义工厂接口的不可实例化类。例如(使用Java进行说明),抽象工厂(FooFactory
)类似于:
public class Foo {}
public interface FooFactory {
public Foo createFoo() { /* ... */ }
}
由于此foodfactory
是一个接口(是抽象的),因此无法实例化。例如,以下内容无效(并且无法编译):
具体工厂(在本例中称为concretefoodfactory
)是一个实现foodfactory
接口的可实例化类:
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编写。有关更多信息,请参阅。我不明白为什么这一点被否决。。。这个问题很明确,格式也很好。。
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());