Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript设计模式:什么是混凝土工厂?_Javascript_Design Patterns - Fatal编程技术网

JavaScript设计模式:什么是混凝土工厂?

JavaScript设计模式:什么是混凝土工厂?,javascript,design-patterns,Javascript,Design Patterns,当我在读有关工厂的书时,我遇到了这两个术语抽象工厂和具体工厂 在阅读StackOverflow时,我找到了一些很好的答案(比如)关于工厂和抽象工厂,但仍然不清楚具体工厂是什么 所以,我想问: 什么是混凝土工厂 它与抽象工厂有何不同 编辑:在单独的问题()中提出问题#2,以使这两个讨论保持分开 到目前为止我的理解(关于工厂): 在高层,我理解工厂指的是一个方法,它返回一个全新的东西(可以是任何东西,一个对象,一个方法,我们需要的任何东西),我们称之为工厂。这里,如果我错了,请纠正我 工厂封装

当我在读有关工厂的书时,我遇到了这两个术语抽象工厂具体工厂

在阅读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());