AngularJS: Nhà máy là gì?


101

Tôi đã làm rất nhiều việc Angular.jsvà nhìn chung tôi thấy nó là một khuôn khổ thú vị và mạnh mẽ.

Tôi biết đã có rất nhiều cuộc thảo luận về Dịch vụ so với Nhà máy so với Nhà cung cấp so với Giá trị, nhưng tôi vẫn khá bối rối không biết a Factorylà gì .

Nhà máy đã được định nghĩa trong các cuộc thảo luận StackOverflow khác như sau:

Nhà máy

Cú pháp: module.factory( 'factoryName', function );Kết quả: Khi khai báo factoryName là một đối số có thể tiêm vào, bạn sẽ được cung cấp giá trị được trả về bằng cách gọi tham chiếu hàm được truyền đến module.factory.

Tôi thấy lời giải thích này rất khó hiểu và nó không giúp tôi hiểu hơn về nhà máy là gì.

Would bất cứ ai có bất cứ lời giải thích hay những ví dụ thực tế đời sống để chia sẻ về những gì chính xác một Factorylà gì và tại sao bạn nên sử dụng nó thay cho một Service, Providerhoặc khác?

Cập nhật

A service chứa một tham chiếu đến bất kỳ đối tượng nào .

A factory là một hàm trả về bất kỳ đối tượng nào

A provider là một hàm trả về bất kỳ hàm nào

- phew -


6
Tôi sẽ không nói đây là một bản sao của câu hỏi đó, thay vì tôi đọc câu hỏi đó trước khi hỏi câu này vì câu trả lời của nó trên Factories(trích dẫn ở trên) hơi khó hiểu. Một số câu trả lời bên dưới rút gọn Factoriesthành một vài thứ mà tôi có thể hiểu được
Code Whisperer

1
Câu hỏi này có nhiều lượt ủng hộ hơn câu hỏi mà nó "nhân đôi", có lẽ mọi thứ nên theo chiều ngược lại?
Code Whisperer

3
Liên kết này giải thích nó tốt.
Ahmed

Câu trả lời:


70

Theo những gì tôi hiểu thì tất cả chúng đều khá giống nhau. Sự khác biệt chính là sự phức tạp của chúng. Các nhà cung cấp có thể định cấu hình trong thời gian chạy, các nhà máy mạnh hơn một chút và dịch vụ là dạng đơn giản nhất.

Kiểm tra câu hỏi này AngularJS: Dịch vụ so với nhà cung cấp và nhà máy

Ngoài ra, ý chính này có thể hữu ích trong việc hiểu những khác biệt nhỏ.

Nguồn: https://groups.google.com/forum/#!topic/angular/hVrkvaHGOfc

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

tác giả: 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()];
}​

Vì vậy, một cách để xem xét chúng, đó là theo thứ tự phức tạp của chúng Provider > Factory > Service > Value?
Code Whisperer

2
Đó là một cách để nhìn vào nó, một cách khác sẽ nghĩ về Nhà máy và Dịch vụ như là những phần tóm tắt của Nhà cung cấp. Ai đó sẽ sửa cho tôi nếu tôi sai nhưng Nhà cung cấp dịch vụ và sử dụng dịch vụ sẽ ẩn. Đó là lý do tại sao cung cấp là phiên bản "Gần nhất với kim loại". Tôi tin rằng Giá trị là một cách để xác định các hằng số sau đó có thể được sử dụng trong ứng dụng rộng rãi.
Jonathan Palumbo

18

Một điểm khác biệt chính mà tôi thấy là bạn có thể chạy mã tùy chỉnh trong nhà máy. Tuy nhiên, trong một dịch vụ, chỉ việc tạo đối tượng xảy ra.

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

    //Write custom code here

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

1
bạn cũng có thể chạy mã tùy chỉnh trong một hàm tạo dịch vụ, phải không? không ai nói bên trong một hàm tạo, bạn không thể chạy mã khác
nonopolarity 29/02/16

9

Hai xu của tôi về chủ đề này. Tôi là một người rất mới và chỉ mới hiểu về Angular JS và đây là một trong những điều khiến tôi bối rối rất nhiều và do đó tôi đã nghiên cứu nó một cách chi tiết. Tôi đã ghi chú cho các cuộc phỏng vấn và điều này có thể hữu ích cho những người khác.

  • dịch vụ và nhà máy làm những việc giống nhau theo những cách khác nhau
  • cả hai đều bị thương
  • đối với hầu hết mọi thứ, hãy sử dụng cú pháp gốc
  • Dễ hiểu
  • ngày nay với es6 "dịch vụ" được thực hiện vì nó chuyển đổi sang các lớp es6 tốt hơn
  • về cơ bản nó trừu tượng hóa logic nghiệp vụ khỏi bộ điều khiển
  • nếu bạn sử dụng logic biz với bộ điều khiển thì bạn chỉ có thể sử dụng với bộ điều khiển
  • bộ điều khiển là để đưa dữ liệu vào phạm vi không xử lý logic biz dài dòng
  • vì vậy những gì xảy ra trong kịch bản trên là logic biz phức tạp được gắn với bộ điều khiển. Không phải để xử lý dữ liệu. Vì vậy, hãy đưa từng phần của nó vào các dịch vụ hoặc nhà máy. Vì vậy, mã của bạn là gọn gàng và mô-đun.
  • dịch vụ là những người độc thân

0

Các dịch vụ chủ yếu là các đối tượng trong đó bạn mô tả lớp phương thức khởi tạo của đối tượng. Ở đâu đó sâu trong khuôn khổ, hàm Object.create () được gọi và sau đó bạn có thể sử dụng một dịch vụ bằng cách gọi đối tượng và các phương thức của nó bằng bộ điều khiển. Mặt khác, Factory không tạo đối tượng theo mặc định và do đó yêu cầu bạn trả lại toàn bộ vị trí đối tượng sau khi bạn xác định xong tất cả các thuộc tính và phương thức.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.