{"id":124,"date":"2024-01-23T07:19:13","date_gmt":"2024-01-23T07:19:13","guid":{"rendered":"https:\/\/ramanjawade.com\/?p=124"},"modified":"2024-01-23T07:48:08","modified_gmt":"2024-01-23T07:48:08","slug":"adobe-commerce-magento2-design-patterns","status":"publish","type":"post","link":"https:\/\/ramanjawade.com\/?p=124","title":{"rendered":"Adobe Commerce (Magento2) Design Patterns"},"content":{"rendered":"\n

Most commonly used design patterns <\/h2>\n\n\n\n

1. MODEL VIEW CONTROLLER (MVC) PATTERN:<\/strong><\/h3>\n\n\n\n

The MVC pattern is a software architectural design that separates an application into three interconnected components: Model (data and business logic), View (presentation and user interface), and Controller (handles user input and interaction). In Magento 2, this pattern ensures a clear separation of concerns and facilitates modular development and maintenance.<\/p>\n\n\n\n

Model:<\/strong><\/p>\n\n\n\n

<\/circle><\/circle><\/circle><\/g><\/svg><\/span><\/path><\/path><\/svg><\/span>
\/\/ app\/code\/Vendor\/Module\/Model\/Item.php<\/span><\/span>\nclass<\/span> <\/span>Vendor_Module_Model_Item<\/span> <\/span>extends<\/span> \\<\/span>Magento<\/span>\\<\/span>Framework<\/span>\\<\/span>Model<\/span>\\<\/span>AbstractModel<\/span> <\/span>{<\/span><\/span>\n    <\/span>\/\/ Model logic<\/span><\/span>\n}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n

View:<\/strong><\/p>\n\n\n\n

<\/circle><\/circle><\/circle><\/g><\/svg><\/span><\/path><\/path><\/svg><\/span>
<!--<\/span> <\/span>app<\/span>\/<\/span>code<\/span>\/<\/span>Vendor<\/span>\/<\/span>Module<\/span>\/<\/span>view<\/span>\/<\/span>frontend<\/span>\/<\/span>layout<\/span>\/<\/span>module_index_index<\/span>.<\/span>xml<\/span> <\/span>--><\/span><\/span>\n<page<\/span> <\/span>xmlns<\/span>:<\/span>xsi<\/span>=<\/span>"<\/span>http:\/\/www.w3.org\/2001\/XMLSchema-instance<\/span>"<\/span> <\/span>xsi<\/span>:<\/span>noNamespaceSchemaLocation<\/span>=<\/span>"<\/span>urn:magento:framework:View\/Layout\/etc\/page_configuration.xsd<\/span>"<\/span>><\/span><\/span>\n    <\/span><body><\/span><\/span>\n        <\/span><<\/span>referenceBlock<\/span> <\/span>name<\/span>=<\/span>"<\/span>content<\/span>"<\/span>><\/span><\/span>\n            <\/span><block<\/span> <\/span>class<\/span>=<\/span>"<\/span>Vendor\\Module\\Block\\Item<\/span>"<\/span> <\/span>template<\/span>=<\/span>"<\/span>Vendor_Module::item.phtml<\/span>"<\/span> <\/span>\/><\/span><\/span>\n        <\/span><\/<\/span>referenceBlock<\/span>><\/span><\/span>\n    <\/span><\/body><\/span><\/span>\n<\/page><\/span><\/span><\/code><\/pre><\/div>\n\n\n\n

Controller:<\/strong><\/p>\n\n\n\n

<\/circle><\/circle><\/circle><\/g><\/svg><\/span><\/path><\/path><\/svg><\/span>
\/\/ app\/code\/Vendor\/Module\/Controller\/Index\/Index.php<\/span><\/span>\nclass<\/span> <\/span>Index<\/span> <\/span>extends<\/span> \\<\/span>Magento<\/span>\\<\/span>Framework<\/span>\\<\/span>App<\/span>\\<\/span>Action<\/span>\\<\/span>Action<\/span> <\/span>{<\/span><\/span>\n    <\/span>public<\/span> <\/span>function<\/span> <\/span>execute<\/span>()<\/span> <\/span>{<\/span><\/span>\n        <\/span>$this<\/span>-><\/span>_view<\/span>-><\/span>loadLayout<\/span>()<\/span>;<\/span><\/span>\n        <\/span>$this<\/span>-><\/span>_view<\/span>-><\/span>renderLayout<\/span>()<\/span>;<\/span><\/span>\n    <\/span>}<\/span><\/span>\n}<\/span><\/span>\n<\/span><\/code><\/pre><\/div>\n\n\n\n
<\/div>\n\n\n\n

2. FRONT CONTROLLER PATTERN:<\/strong><\/h3>\n\n\n\n

The Front Controller pattern centralizes request handling in an application. In Magento 2, the index.php<\/code> file acts as the front controller, receiving all HTTP requests and dispatching them to the appropriate controllers. This pattern allows for a single point of entry and simplifies the handling of requests.<\/p>\n\n\n\n

Example:<\/p>\n\n\n\n

<\/circle><\/circle><\/circle><\/g><\/svg><\/span><\/path><\/path><\/svg><\/span>
\/\/ pub\/index.php<\/span><\/span>\nuse<\/span> <\/span>Magento<\/span>\\<\/span>Framework<\/span>\\<\/span>App<\/span>\\<\/span>Bootstrap<\/span>;<\/span><\/span>\n<\/span>\nrequire<\/span> <\/span>__DIR__<\/span> <\/span>.<\/span> <\/span>'<\/span>\/..\/app\/bootstrap.php<\/span>'<\/span>;<\/span><\/span>\n<\/span>\n$bootstrap<\/span> <\/span>=<\/span> Bootstrap<\/span>:<\/span>:<\/span>create<\/span>(<\/span>BP<\/span>,<\/span> <\/span>$_SERVER<\/span>)<\/span>;<\/span><\/span>\n$objectManager<\/span> <\/span>=<\/span> <\/span>$bootstrap<\/span>-><\/span>getObjectManager<\/span>()<\/span>;<\/span><\/span>\n<\/span>\n\/** <\/span>@<\/span>var<\/span> \\Magento\\Framework\\App\\Http $app *\/<\/span><\/span>\n$app<\/span> <\/span>=<\/span> <\/span>$objectManager<\/span>-><\/span>create<\/span>(\\<\/span>Magento<\/span>\\<\/span>Framework<\/span>\\<\/span>App<\/span>\\<\/span>Http<\/span>::<\/span>class<\/span>)<\/span>;<\/span><\/span>\n$app<\/span>-><\/span>launch<\/span>()<\/span>;<\/span><\/span>\n<\/span><\/code><\/pre><\/div>\n\n\n\n
<\/div>\n\n\n\n

3. FACTORY PATTERN:<\/strong><\/h3>\n\n\n\n

The Factory Pattern is a creational pattern that provides an interface for creating instances of classes without specifying their concrete classes. In Magento 2, factories are commonly used to instantiate objects, especially models. Factories abstract the process of object creation, making the system more flexible and maintainable.<\/p>\n\n\n\n

Example:<\/p>\n\n\n\n

<\/circle><\/circle><\/circle><\/g><\/svg><\/span><\/path><\/path><\/svg><\/span>
\/\/ app\/code\/Vendor\/Module\/Controller\/Index\/Index.php<\/span><\/span>\nclass<\/span> <\/span>Index<\/span> <\/span>extends<\/span> \\<\/span>Magento<\/span>\\<\/span>Framework<\/span>\\<\/span>App<\/span>\\<\/span>Action<\/span>\\<\/span>Action<\/span> <\/span>{<\/span><\/span>\n    <\/span>protected<\/span> $itemFactory<\/span>;<\/span><\/span>\n<\/span>\n    <\/span>public<\/span> <\/span>function<\/span> <\/span>__construct<\/span>(<\/span>\\<\/span>Vendor<\/span>\\<\/span>Module<\/span>\\<\/span>Model<\/span>\\<\/span>ItemFactory<\/span> <\/span>$itemFactory<\/span>)<\/span> <\/span>{<\/span><\/span>\n        <\/span>$this<\/span>-><\/span>itemFactory<\/span> <\/span>=<\/span> <\/span>$itemFactory<\/span>;<\/span><\/span>\n    <\/span>}<\/span><\/span>\n<\/span>\n    <\/span>public<\/span> <\/span>function<\/span> <\/span>execute<\/span>()<\/span> <\/span>{<\/span><\/span>\n        <\/span>$item<\/span> <\/span>=<\/span> <\/span>$this<\/span>-><\/span>itemFactory<\/span>-><\/span>create<\/span>()<\/span>;<\/span><\/span>\n        <\/span>\/\/ Perform actions with $item<\/span><\/span>\n    <\/span>}<\/span><\/span>\n}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n
<\/div>\n\n\n\n

4. SINGLETON PATTERN:<\/strong><\/h3>\n\n\n\n

The Singleton Pattern ensures that a class has only one instance and provides a global point of access to that instance. In Magento 2, singleton instances are often used for shared resources and services, ensuring that only one instance is created and reused throughout the application.<\/p>\n\n\n\n

Example:<\/p>\n\n\n\n

<\/circle><\/circle><\/circle><\/g><\/svg><\/span><\/path><\/path><\/svg><\/span>
\/\/ app\/code\/Vendor\/Module\/Model\/Singleton.php<\/span><\/span>\nclass<\/span> <\/span>Singleton<\/span> <\/span>{<\/span><\/span>\n    <\/span>private<\/span> <\/span>static<\/span> $instance<\/span>;<\/span><\/span>\n<\/span>\n    <\/span>private<\/span> <\/span>function<\/span> <\/span>__construct<\/span>()<\/span> <\/span>{<\/span><\/span>\n        <\/span>\/\/ Private constructor to prevent instantiation<\/span><\/span>\n    <\/span>}<\/span><\/span>\n<\/span>\n    <\/span>public<\/span> <\/span>static<\/span> <\/span>function<\/span> <\/span>getInstance<\/span>()<\/span> <\/span>{<\/span><\/span>\n        <\/span>if<\/span> (<\/span>!<\/span>isset<\/span>(<\/span>self<\/span>::<\/span>$instance<\/span>)) <\/span>{<\/span><\/span>\n            self<\/span>:<\/span>:<\/span>$instance<\/span> <\/span>=<\/span> <\/span>new<\/span> <\/span>self<\/span>()<\/span>;<\/span><\/span>\n        <\/span>}<\/span><\/span>\n        <\/span>return<\/span> <\/span>self<\/span>::<\/span>$instance<\/span>;<\/span><\/span>\n    <\/span>}<\/span><\/span>\n}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n
<\/div>\n\n\n\n

5. REGISTRY PATTERN:<\/strong><\/h3>\n\n\n\n

The Registry Pattern provides a centralized place to store shared objects or data. In Magento 2, the registry is a global container for storing variables and objects that need to be accessible across different parts of the application. It allows for a convenient way to share information without relying on global variables.<\/p>\n\n\n\n

Example:<\/p>\n\n\n\n

<\/circle><\/circle><\/circle><\/g><\/svg><\/span><\/path><\/path><\/svg><\/span>
\/\/ Storing value in registry<\/span><\/span>\n\\<\/span>Magento<\/span>\\<\/span>Framework<\/span>\\Registry<\/span>:<\/span>:<\/span>register<\/span>(<\/span>'<\/span>key<\/span>'<\/span>,<\/span> <\/span>$value<\/span>)<\/span>;<\/span><\/span>\n<\/span>\n\/\/ Retrieving value from registry<\/span><\/span>\n$value<\/span> <\/span>=<\/span> \\<\/span>Magento<\/span>\\<\/span>Framework<\/span>\\Registry<\/span>:<\/span>:<\/span>registry<\/span>(<\/span>'<\/span>key<\/span>'<\/span>)<\/span>;<\/span><\/span>\n<\/span><\/code><\/pre><\/div>\n\n\n\n
<\/div>\n\n\n\n

6. PROTOTYPE PATTERN:<\/strong><\/h3>\n\n\n\n

The Prototype Pattern involves creating new objects by copying an existing object, known as the prototype. While not explicitly implemented in Magento 2, the concept of cloning objects is used in certain scenarios to create copies of existing objects.<\/p>\n\n\n\n

Example:<\/p>\n\n\n\n

<\/circle><\/circle><\/circle><\/g><\/svg><\/span><\/path><\/path><\/svg><\/span>
\/\/ app\/code\/Vendor\/Module\/Model\/Item.php<\/span><\/span>\nclass<\/span> <\/span>Item<\/span> <\/span>implements<\/span> \\<\/span>Magento<\/span>\\<\/span>Framework<\/span>\\<\/span>CloneableInterface<\/span> <\/span>{<\/span><\/span>\n    <\/span>public<\/span> <\/span>function<\/span> <\/span>__clone<\/span>()<\/span> <\/span>{<\/span><\/span>\n        <\/span>\/\/ Implement cloning logic<\/span><\/span>\n    <\/span>}<\/span><\/span>\n}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n
<\/div>\n\n\n\n

7. OBJECT POOL PATTERN:<\/strong><\/h3>\n\n\n\n

The Object Pool Pattern manages a pool of objects, providing a way to reuse and manage resources efficiently. In Magento 2, this pattern may be used in scenarios where creating and destroying objects frequently is resource-intensive, and reusing existing objects improves performance.<\/p>\n\n\n\n

Example (simplified):<\/p>\n\n\n\n

<\/circle><\/circle><\/circle><\/g><\/svg><\/span><\/path><\/path><\/svg><\/span>
\/\/ app\/code\/Vendor\/Module\/Model\/ObjectPool.php<\/span><\/span>\nclass<\/span> <\/span>ObjectPool<\/span> <\/span>{<\/span><\/span>\n    <\/span>private<\/span> $objects <\/span>=<\/span> []<\/span>;<\/span><\/span>\n<\/span>\n    <\/span>public<\/span> <\/span>function<\/span> <\/span>getObject<\/span>()<\/span> <\/span>{<\/span><\/span>\n        <\/span>if<\/span> (<\/span>empty<\/span>(<\/span>$this<\/span>-><\/span>objects<\/span>)) <\/span>{<\/span><\/span>\n            <\/span>return<\/span> <\/span>new<\/span> <\/span>MyObject<\/span>()<\/span>;<\/span><\/span>\n        <\/span>}<\/span> <\/span>else<\/span> <\/span>{<\/span><\/span>\n            <\/span>return<\/span> <\/span>array_pop<\/span>(<\/span>$this<\/span>-><\/span>objects<\/span>)<\/span>;<\/span><\/span>\n        <\/span>}<\/span><\/span>\n    <\/span>}<\/span><\/span>\n<\/span>\n    <\/span>public<\/span> <\/span>function<\/span> <\/span>releaseObject<\/span>(<\/span>MyObject<\/span> <\/span>$object<\/span>)<\/span> <\/span>{<\/span><\/span>\n        <\/span>$this<\/span>-><\/span>objects<\/span>[] <\/span>=<\/span> <\/span>$object<\/span>;<\/span><\/span>\n    <\/span>}<\/span><\/span>\n}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n
<\/div>\n\n\n\n

8. ITERATOR PATTERN:<\/strong><\/h3>\n\n\n\n

The Iterator Pattern provides a way to access elements of an aggregate object sequentially without exposing its underlying representation. Magento 2 uses iterators in various contexts, such as collections, to traverse and manipulate sets of objects.<\/p>\n\n\n\n

Example:<\/p>\n\n\n\n

<\/circle><\/circle><\/circle><\/g><\/svg><\/span><\/path><\/path><\/svg><\/span>
\/\/ app\/code\/Vendor\/Module\/Model\/ItemCollection.php<\/span><\/span>\nclass<\/span> <\/span>ItemCollection<\/span> <\/span>implements<\/span> \\<\/span>IteratorAggregate<\/span> <\/span>{<\/span><\/span>\n    <\/span>private<\/span> $items <\/span>=<\/span> []<\/span>;<\/span><\/span>\n<\/span>\n    <\/span>public<\/span> <\/span>function<\/span> <\/span>add<\/span>(<\/span>Item<\/span> <\/span>$item<\/span>)<\/span> <\/span>{<\/span><\/span>\n        <\/span>$this<\/span>-><\/span>items<\/span>[] <\/span>=<\/span> <\/span>$item<\/span>;<\/span><\/span>\n    <\/span>}<\/span><\/span>\n<\/span>\n    <\/span>public<\/span> <\/span>function<\/span> <\/span>getIterator<\/span>()<\/span> <\/span>{<\/span><\/span>\n        <\/span>return<\/span> <\/span>new<\/span> \\<\/span>ArrayIterator<\/span>(<\/span>$this<\/span>-><\/span>items<\/span>)<\/span>;<\/span><\/span>\n    <\/span>}<\/span><\/span>\n}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n
<\/div>\n\n\n\n

9. LAZY LOADING PATTERN:<\/strong><\/h3>\n\n\n\n

The Lazy Loading Pattern defers the loading of an object until it is actually needed. In Magento 2, lazy loading is often employed using proxies, where an object is created only when a specific method is called, improving performance by loading resources on demand.<\/p>\n\n\n\n

Example (using proxy):<\/p>\n\n\n\n

<\/circle><\/circle><\/circle><\/g><\/svg><\/span><\/path><\/path><\/svg><\/span>
\/\/ app\/code\/Vendor\/Module\/Model\/Item.php<\/span><\/span>\nclass<\/span> <\/span>Item<\/span> <\/span>extends<\/span> \\<\/span>Magento<\/span>\\<\/span>Framework<\/span>\\<\/span>Model<\/span>\\<\/span>AbstractModel<\/span> <\/span>{<\/span><\/span>\n    <\/span>public<\/span> <\/span>function<\/span> <\/span>getRelatedData<\/span>()<\/span> <\/span>{<\/span><\/span>\n        <\/span>\/\/ Lazy loading using proxy<\/span><\/span>\n        <\/span>return<\/span> <\/span>$this<\/span>-><\/span>_getData<\/span>(<\/span>'<\/span>related_data<\/span>'<\/span>)<\/span>;<\/span><\/span>\n    <\/span>}<\/span><\/span>\n}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n
<\/div>\n\n\n\n

10. SERVICE LOCATOR PATTERN:<\/strong><\/h3>\n\n\n\n

The Service Locator Pattern provides a centralized point for registering and locating services within a system. In Magento 2, the Object Manager acts as a service locator, responsible for creating and managing instances of objects, facilitating a centralized mechanism for dependency resolution.<\/p>\n\n\n\n

Example:<\/p>\n\n\n\n

<\/circle><\/circle><\/circle><\/g><\/svg><\/span><\/path><\/path><\/svg><\/span>
$objectManager<\/span> <\/span>=<\/span> \\<\/span>Magento<\/span>\\<\/span>Framework<\/span>\\<\/span>App<\/span>\\ObjectManager<\/span>:<\/span>:<\/span>getInstance<\/span>()<\/span>;<\/span><\/span>\n$myService<\/span> <\/span>=<\/span> <\/span>$objectManager<\/span>-><\/span>get<\/span>(<\/span>'<\/span>My<\/span>\\C<\/span>ustom<\/span>\\S<\/span>ervice<\/span>'<\/span>)<\/span>;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n
<\/div>\n\n\n\n

11. MODULE PATTERN:<\/strong><\/h3>\n\n\n\n

The Module Pattern is an architectural pattern that promotes modularity by encapsulating related functionality into separate modules. In Magento 2, each feature or functionality is encapsulated within a module, allowing for better organization, maintainability, and reusability.<\/p>\n\n\n\n

Example:<\/p>\n\n\n\n

<\/circle><\/circle><\/circle><\/g><\/svg><\/span><\/path><\/path><\/svg><\/span>
<!--<\/span> <\/span>app<\/span>\/<\/span>code<\/span>\/<\/span>Vendor<\/span>\/<\/span>Module<\/span>\/<\/span>etc<\/span>\/<\/span>module<\/span>.<\/span>xml<\/span> <\/span>--><\/span><\/span>\n<config<\/span> <\/span>xmlns<\/span>:<\/span>xsi<\/span>=<\/span>"<\/span>http:\/\/www.w3.org\/2001\/XMLSchema-instance<\/span>"<\/span> <\/span>xsi<\/span>:<\/span>noNamespaceSchemaLocation<\/span>=<\/span>"<\/span>urn:magento:framework:Module\/etc\/module.xsd<\/span>"<\/span>><\/span><\/span>\n    <\/span><module<\/span> <\/span>name<\/span>=<\/span>"<\/span>Vendor_Module<\/span>"<\/span> <\/span>setup_version<\/span>=<\/span>"<\/span>1.0.0<\/span>"<\/span>><\/span><\/span>\n        <!-- Module configuration --><\/span><\/span>\n    <\/span><\/module><\/span><\/span>\n<\/config><\/span><\/span><\/code><\/pre><\/div>\n\n\n\n
<\/div>\n\n\n\n

12. OBSERVER PATTERN:<\/strong><\/h3>\n\n\n\n

The Observer Pattern is used for event handling, where an object (observer) subscribes to and listens for events triggered by another object (subject). Magento 2 extensively uses observers for decoupled and extensible event-driven architecture, allowing customizations without modifying core code.<\/p>\n\n\n\n

Example:<\/p>\n\n\n\n

<\/circle><\/circle><\/circle><\/g><\/svg><\/span><\/path><\/path><\/svg><\/span>
<!--<\/span> <\/span>app<\/span>\/<\/span>code<\/span>\/<\/span>Vendor<\/span>\/<\/span>Module<\/span>\/<\/span>etc<\/span>\/<\/span>events<\/span>.<\/span>xml<\/span> <\/span>--><\/span><\/span>\n<config<\/span> <\/span>xmlns<\/span>:<\/span>xsi<\/span>=<\/span>"<\/span>http:\/\/www.w3.org\/2001\/XMLSchema-instance<\/span>"<\/span> <\/span>xsi<\/span>:<\/span>noNamespaceSchemaLocation<\/span>=<\/span>"<\/span>urn:magento:framework:Event\/etc\/events.xsd<\/span>"<\/span>><\/span><\/span>\n    <\/span><event<\/span> <\/span>name<\/span>=<\/span>"<\/span>some_event<\/span>"<\/span>><\/span><\/span>\n        <\/span><observer<\/span> <\/span>name<\/span>=<\/span>"<\/span>custom_observer<\/span>"<\/span> <\/span>instance<\/span>=<\/span>"<\/span>Vendor\\Module\\Observer\\CustomObserver<\/span>"<\/span> <\/span>\/><\/span><\/span>\n    <\/span><\/event><\/span><\/span>\n<\/config><\/span><\/span><\/code><\/pre><\/div>\n\n\n\n
<\/circle><\/circle><\/circle><\/g><\/svg><\/span><\/path><\/path><\/svg><\/span>
\/\/ app\/code\/Vendor\/Module\/Observer\/CustomObserver.php<\/span><\/span>\nclass<\/span> <\/span>CustomObserver<\/span> <\/span>implements<\/span> \\<\/span>Magento<\/span>\\<\/span>Framework<\/span>\\<\/span>Event<\/span>\\<\/span>ObserverInterface<\/span> <\/span>{<\/span><\/span>\n    <\/span>public<\/span> <\/span>function<\/span> <\/span>execute<\/span>(<\/span>\\<\/span>Magento<\/span>\\<\/span>Framework<\/span>\\<\/span>Event<\/span>\\<\/span>Observer<\/span> <\/span>$observer<\/span>)<\/span> <\/span>{<\/span><\/span>\n        <\/span>\/\/ Observer logic<\/span><\/span>\n    <\/span>}<\/span><\/span>\n}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n
<\/div>\n\n\n\n

13. SERVICE CONTRACT DESIGN PATTERN:<\/strong><\/h3>\n\n\n\n

The Service Contract Design Pattern defines a clear and standardized API for a module, promoting interoperability and versioning. In Magento 2, service contracts are used to define interfaces for modules, ensuring a consistent and stable contract between different components.<\/p>\n\n\n\n

Example:<\/p>\n\n\n\n

<\/circle><\/circle><\/circle><\/g><\/svg><\/span><\/path><\/path><\/svg><\/span>
\/\/ app\/code\/Vendor\/Module\/Api\/MyInterface.php<\/span><\/span>\ninterface<\/span> MyInterface <\/span>{<\/span><\/span>\n    <\/span>public<\/span> <\/span>function<\/span> <\/span>myMethod<\/span>()<\/span>;<\/span><\/span>\n}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n
<\/div>\n\n\n\n

14. OBJECT MANAGER:<\/strong><\/h3>\n\n\n\n

The Object Manager is a key component in Magento 2 responsible for creating, configuring, and managing objects. It acts as a central hub for dependency injection, allowing for the instantiation of objects and resolving dependencies throughout the application.<\/p>\n\n\n\n

Example:<\/p>\n\n\n\n

<\/circle><\/circle><\/circle><\/g><\/svg><\/span><\/path><\/path><\/svg><\/span>
$objectManager<\/span> <\/span>=<\/span> \\<\/span>Magento<\/span>\\<\/span>Framework<\/span>\\<\/span>App<\/span>\\ObjectManager<\/span>:<\/span>:<\/span>getInstance<\/span>()<\/span>;<\/span><\/span>\n$myObject<\/span> <\/span>=<\/span> <\/span>$objectManager<\/span>-><\/span>create<\/span>(<\/span>'<\/span>My<\/span>\\C<\/span>ustom<\/span>\\O<\/span>bject<\/span>'<\/span>)<\/span>;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n
<\/div>\n\n\n\n

15. INJECTABLE OBJECTS \/ NON-INJECTABLE OBJECTS:<\/strong><\/h3>\n\n\n\n

Magento 2 introduces the concept of injectable and non-injectable objects. Injectable objects can have dependencies automatically injected through constructor injection, promoting better testability and maintainability. Non-injectable objects may be instantiated directly or through the Object Manager.<\/p>\n\n\n\n

Example (Injectable):<\/p>\n\n\n\n

<\/circle><\/circle><\/circle><\/g><\/svg><\/span><\/path><\/path><\/svg><\/span>
\/\/ Constructor injection<\/span><\/span>\npublic<\/span> <\/span>function<\/span> <\/span>__construct<\/span>(<\/span>\\<\/span>Magento<\/span>\\<\/span>Catalog<\/span>\\<\/span>Model<\/span>\\<\/span>Product<\/span> <\/span>$product<\/span>)<\/span> <\/span>{<\/span><\/span>\n    <\/span>$this<\/span>-><\/span>product<\/span> <\/span>=<\/span> <\/span>$product<\/span>;<\/span><\/span>\n}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n

Example (Non-Injectable):<\/p>\n\n\n\n

<\/circle><\/circle><\/circle><\/g><\/svg><\/span><\/path><\/path><\/svg><\/span>
\/\/ Direct instantiation<\/span><\/span>\n$product<\/span> <\/span>=<\/span> \\<\/span>Magento<\/span>\\<\/span>Framework<\/span>\\<\/span>App<\/span>\\ObjectManager<\/span>:<\/span>:<\/span>getInstance<\/span>()<\/span>-><\/span>create<\/span>(\\<\/span>Magento<\/span>\\<\/span>Catalog<\/span>\\<\/span>Model<\/span>\\<\/span>Product<\/span>::<\/span>class<\/span>)<\/span>;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n
<\/div>\n\n\n\n

16. DEPENDENCY INJECTION:<\/strong><\/h3>\n\n\n\n

Dependency Injection is a design pattern where the dependencies of a class are provided from the outside rather than created within the class. In Magento 2, dependency injection is widely used to inject dependencies into constructors, making the code more modular, testable, and adhering to the principles of Inversion of Control (IoC).<\/p>\n\n\n\n

Example:<\/p>\n\n\n\n

<\/circle><\/circle><\/circle><\/g><\/svg><\/span><\/path><\/path><\/svg><\/span>
\/\/ Constructor injection<\/span><\/span>\npublic<\/span> <\/span>function<\/span> <\/span>__construct<\/span>(<\/span>\\<\/span>Magento<\/span>\\<\/span>Catalog<\/span>\\<\/span>Model<\/span>\\<\/span>Product<\/span> <\/span>$product<\/span>)<\/span> <\/span>{<\/span><\/span>\n    <\/span>$this<\/span>-><\/span>product<\/span> <\/span>=<\/span> <\/span>$product<\/span>;<\/span><\/span>\n}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n
<\/div>\n\n\n\n

17. FACTORY PATTERN OR FACTORY CLASSES:<\/strong><\/h3>\n\n\n\n

The Factory Pattern involves creating objects without specifying the exact class of the object that will be created. In Magento 2, factory classes are commonly used to create instances of objects, especially models, providing a level of abstraction for object instantiation.<\/p>\n\n\n\n

Example:<\/p>\n\n\n\n

<\/circle><\/circle><\/circle><\/g><\/svg><\/span><\/path><\/path><\/svg><\/span>
\/\/ app\/code\/Vendor\/Module\/Model\/ItemFactory.php<\/span><\/span>\nclass<\/span> <\/span>ItemFactory<\/span> <\/span>{<\/span><\/span>\n    <\/span>protected<\/span> $objectManager<\/span>;<\/span><\/span>\n<\/span>\n    <\/span>public<\/span> <\/span>function<\/span> <\/span>__construct<\/span>(<\/span>\\<\/span>Magento<\/span>\\<\/span>Framework<\/span>\\<\/span>ObjectManagerInterface<\/span> <\/span>$objectManager<\/span>)<\/span> <\/span>{<\/span><\/span>\n        <\/span>$this<\/span>-><\/span>objectManager<\/span> <\/span>=<\/span> <\/span>$objectManager<\/span>;<\/span><\/span>\n    <\/span>}<\/span><\/span>\n<\/span>\n    <\/span>public<\/span> <\/span>function<\/span> <\/span>create<\/span>(<\/span>array<\/span> <\/span>$data<\/span> <\/span>=<\/span> []<\/span>)<\/span> <\/span>{<\/span><\/span>\n        <\/span>return<\/span> <\/span>$this<\/span>-><\/span>objectManager<\/span>-><\/span>create<\/span>(<\/span>'<\/span>Vendor<\/span>\\M<\/span>odule<\/span>\\M<\/span>odel<\/span>\\I<\/span>tem<\/span>'<\/span>,<\/span> <\/span>$data<\/span>)<\/span>;<\/span><\/span>\n    <\/span>}<\/span><\/span>\n}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n
<\/div>\n\n\n\n

18. PROXY PATTERN:<\/strong><\/h3>\n\n\n\n

The Proxy Pattern involves creating a placeholder for another object to control access to it. In Magento 2, proxies are often used for lazy loading, where an object is loaded only when a specific method is invoked, allowing for efficient resource utilization.<\/p>\n\n\n\n

Example:<\/p>\n\n\n\n

<\/circle><\/circle><\/circle><\/g><\/svg><\/span><\/path><\/path><\/svg><\/span>
\/\/ app\/code\/Vendor\/Module\/Model\/Item.php<\/span><\/span>\nclass<\/span> <\/span>Item<\/span> <\/span>extends<\/span> \\<\/span>Magento<\/span>\\<\/span>Framework<\/span>\\<\/span>Model<\/span>\\<\/span>AbstractModel<\/span> <\/span>{<\/span><\/span>\n    <\/span>public<\/span> <\/span>function<\/span> <\/span>getRelatedData<\/span>()<\/span> <\/span>{<\/span><\/span>\n        <\/span>\/\/ Lazy loading using proxy<\/span><\/span>\n        <\/span>return<\/span> <\/span>$this<\/span>-><\/span>_getData<\/span>(<\/span>'<\/span>related_data<\/span>'<\/span>)<\/span>;<\/span><\/span>\n    <\/span>}<\/span><\/span>\n}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n
<\/div>\n\n\n\n

<\/p>\n","protected":false},"excerpt":{"rendered":"

Most commonly used design patterns 1. MODEL VIEW CONTROLLER (MVC) PATTERN: The MVC pattern is a software architectural design that separates an application into three interconnected components: Model (data and business logic), View (presentation and user interface), and Controller (handles user input and interaction). In Magento 2, this pattern ensures a clear separation of concerns […]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"_links":{"self":[{"href":"https:\/\/ramanjawade.com\/index.php?rest_route=\/wp\/v2\/posts\/124"}],"collection":[{"href":"https:\/\/ramanjawade.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ramanjawade.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ramanjawade.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ramanjawade.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=124"}],"version-history":[{"count":8,"href":"https:\/\/ramanjawade.com\/index.php?rest_route=\/wp\/v2\/posts\/124\/revisions"}],"predecessor-version":[{"id":132,"href":"https:\/\/ramanjawade.com\/index.php?rest_route=\/wp\/v2\/posts\/124\/revisions\/132"}],"wp:attachment":[{"href":"https:\/\/ramanjawade.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=124"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ramanjawade.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=124"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ramanjawade.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=124"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}