AngularJS: โรงงานคืออะไร?


101

ฉันทำงานมาหลายอย่างAngular.jsและโดยรวมแล้วฉันพบว่ามันเป็นกรอบที่น่าสนใจและทรงพลัง

ฉันรู้ว่ามีการพูดคุยกันมากมายเกี่ยวกับบริการกับโรงงานเทียบกับผู้ให้บริการเทียบกับค่านิยม แต่ฉันยังค่อนข้างสับสนว่า a Factoryคืออะไร

โรงงานได้รับการกำหนดไว้ในการอภิปราย StackOverflow อื่น ๆ ดังต่อไปนี้:

โรงงาน

ไวยากรณ์: module.factory( 'factoryName', function );ผลลัพธ์: เมื่อประกาศ factoryName เป็นอาร์กิวเมนต์ที่สามารถฉีดได้คุณจะได้รับค่าที่ส่งคืนโดยการเรียกใช้การอ้างอิงฟังก์ชันที่ส่งไปยัง module.factory

ฉันพบว่าคำอธิบายนี้เข้าใจยากมากและไม่ได้เพิ่มความเข้าใจว่าโรงงานคืออะไร

ทุกคนจะมีคำอธิบายใด ๆ หรือตัวอย่างชีวิตจริงเพื่อใช้ร่วมกันเกี่ยวกับสิ่งที่ตรงFactoryและเหตุผลที่คุณควรจะใช้มันแทนService, Providerหรืออื่น ๆ ?

อัปเดต

service ถืออ้างอิงไปยังวัตถุ

A factory คือฟังก์ชันที่ส่งคืนวัตถุใด ๆ

A provider คือฟังก์ชันที่ส่งกลับฟังก์ชันใด ๆ

- ว้าว -


6
ฉันจะไม่บอกว่านี่เป็นคำถามที่ซ้ำกัน แต่ฉันอ่านคำถามนั้นก่อนที่จะถามคำถามนี้เนื่องจากคำตอบของมันFactories(ยกมาข้างบน) ทำให้สับสนเล็กน้อย คำตอบด้านล่างFactoriesบางส่วนลดลงถึงบางอย่างแม้ฉันจะเข้าใจได้
Code Whisperer

1
คำถามนี้มีคะแนนโหวตมากกว่าคำถามที่ "ซ้ำกัน" บางทีสิ่งต่างๆควรเป็นไปในทางกลับกัน?
Code Whisperer

3
ลิงค์นี้อธิบายได้ดี
Ahmed

คำตอบ:


70

จากสิ่งที่ฉันเข้าใจว่าพวกเขาทั้งหมดค่อนข้างเหมือนกัน ความแตกต่างที่สำคัญคือความซับซ้อนของพวกเขา ผู้ให้บริการสามารถกำหนดค่าได้ที่รันไทม์โรงงานมีประสิทธิภาพมากกว่าเล็กน้อยและบริการเป็นรูปแบบที่ง่ายที่สุด

ลองดูคำถามนี้ AngularJS: บริการเทียบกับผู้ให้บริการและโรงงาน

นอกจากนี้ ส่วนสำคัญอาจเป็นประโยชน์ในการทำความเข้าใจความแตกต่างที่ลึกซึ้ง

ที่มา: https://groups.google.com/forum/#!topic/angular/hVrkvaHGOfc

jsFiddle: http://jsfiddle.net/pkozlowski_opensource/PxdSP/14/

ผู้แต่ง: Pawel Kozlowski

var myApp = angular.module('myApp', []);

//service style, probably the simplest one
myApp.service('helloWorldFromService', function() {
    this.sayHello = function() {
        return "Hello, World!";
    };
});

//factory style, more involved but more sophisticated
myApp.factory('helloWorldFromFactory', function() {
    return {
        sayHello: function() {
            return "Hello, World!";
        }
    };
});

//provider style, full blown, configurable version     
myApp.provider('helloWorld', function() {
    // In the provider function, you cannot inject any
    // service or factory. This can only be done at the
    // "$get" method.

    this.name = 'Default';

    this.$get = function() {
        var name = this.name;
        return {
            sayHello: function() {
                return "Hello, " + name + "!";
            }
        };
    };

    this.setName = function(name) {
        this.name = name;
    };
});

//hey, we can configure a provider!            
myApp.config(function(helloWorldProvider){
    helloWorldProvider.setName('World');
});


function MyCtrl($scope, helloWorld, helloWorldFromFactory, helloWorldFromService) {

    $scope.hellos = [
        helloWorld.sayHello(),
        helloWorldFromFactory.sayHello(),
        helloWorldFromService.sayHello()];
}​

วิธีหนึ่งในการมองพวกเขานั่นคือตามลำดับความซับซ้อนProvider > Factory > Service > Valueหรือไม่?
Code Whisperer

2
นั่นคือวิธีหนึ่งที่จะมองไปที่อีกวิธีหนึ่งคือการคิดว่าโรงงานและบริการเป็นสิ่งที่เป็นนามธรรมของผู้ให้บริการ มีคนแก้ไขฉันถ้าฉันผิด แต่ผู้ให้บริการใช้โรงงานและบริการอยู่ใต้ประทุน ด้วยเหตุนี้จึงเป็นรุ่น "ใกล้เคียงที่สุดกับโลหะ" ฉันเชื่อว่าค่าเป็นวิธีการกำหนดค่าคงที่ซึ่งสามารถใช้งานได้ทั่วทั้งแอปพลิเคชัน
Jonathan Palumbo

18

ความแตกต่างที่สำคัญอย่างหนึ่งที่ฉันเห็นคือคุณสามารถเรียกใช้โค้ดที่กำหนดเองในโรงงานได้ แต่ในบริการการสร้างวัตถุจะเกิดขึ้นเท่านั้น

myJs.factory('Factory', function() {

    //Write custom code here

    return {
            Hello: function() {
            return "Hello, World!"
        }
    };
});

1
คุณสามารถเรียกใช้โค้ดที่กำหนดเองในฟังก์ชันตัวสร้างบริการได้ด้วยใช่ไหม ไม่มีใครพูดในฟังก์ชั่นตัวสร้างคุณไม่สามารถเรียกใช้รหัสอื่นได้
nonopolarity

9

สองเซ็นต์ของฉันในหัวข้อนี้ ฉันเป็นมือใหม่มากและเพิ่งเข้าใจ Angular JS และนี่เป็นหนึ่งในสิ่งที่ทำให้ฉันสับสนมากและด้วยเหตุนี้ฉันจึงศึกษามันโดยละเอียด ฉันจดบันทึกเพื่อให้สัมภาษณ์และนี่อาจเป็นประโยชน์กับคนอื่น ๆ

  • บริการและโรงงานทำสิ่งเดียวกันในรูปแบบที่แตกต่างกัน
  • ทั้งสองเป็นแบบฉีด
  • สำหรับสิ่งต่างๆส่วนใหญ่ใช้ไวยากรณ์ของโรงงาน
  • เข้าใจง่ายขึ้น
  • ทุกวันนี้ด้วย es6 "service" เสร็จแล้วเพราะมันแปลงเป็น es6 class ได้ดีกว่า
  • โดยพื้นฐานแล้วมันจะแยกตรรกะทางธุรกิจออกจากตัวควบคุม
  • หากคุณใช้ตรรกะ biz กับคอนโทรลเลอร์คุณจะสามารถใช้ได้กับคอนโทรลเลอร์เท่านั้น
  • ตัวควบคุมมีไว้สำหรับวางข้อมูลบนขอบเขตที่ไม่ประมวลผลตรรกะ biz ที่มีความยาว
  • ดังนั้นสิ่งที่เกิดขึ้นในสถานการณ์ข้างต้นคือตรรกะ biz ที่ซับซ้อนถูกผูกเข้ากับคอนโทรลเลอร์ ไม่ใช่สำหรับการประมวลผลข้อมูล ดังนั้นใส่บิตและชิ้นส่วนของมันลงในบริการหรือโรงงาน ดังนั้นโค้ดของคุณจึงเป็นแบบลีนและแบบแยกส่วน
  • บริการเป็นเสื้อกล้าม

0

เซอร์วิสส่วนใหญ่เป็นอ็อบเจ็กต์ที่คุณอธิบายคลาสคอนสตรัคเตอร์ของอ็อบเจ็กต์ ที่ใดที่หนึ่งที่อยู่ลึกเข้าไปในกรอบฟังก์ชัน Object.create () จะถูกเรียกใช้จากนั้นคุณสามารถใช้บริการได้โดยเรียกใช้ object และ method โดยใช้คอนโทรลเลอร์ ในทางกลับกันโรงงานจะไม่สร้างวัตถุตามค่าเริ่มต้นดังนั้นคุณต้องส่งคืนตำแหน่งวัตถุทั้งหมดเมื่อคุณกำหนดแอตทริบิวต์และวิธีการทั้งหมดเสร็จแล้ว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.