{"id":1308,"date":"2022-07-06T19:15:25","date_gmt":"2023-08-31T11:00:45","guid":{"rendered":"https:\/\/www.silicloud.com\/blog\/uncategorized\/java-implementation-of-the-abstract-factory-design-pattern\/"},"modified":"2024-03-03T17:51:24","modified_gmt":"2024-03-03T17:51:24","slug":"abstract-factory-java-implementation","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/blog\/abstract-factory-java-implementation\/","title":{"rendered":"Abstract Factory Design Pattern in Java"},"content":{"rendered":"<p>Welcome to the example of the Abstract Factory Design Pattern in Java. The Abstract Factory design pattern belongs to the group of Creational patterns. The Abstract Factory pattern is very similar to the Factory Pattern, with the main difference being that it functions as a factory of factories.<\/p>\n<h2>One possible native paraphrase of &#8220;Abstract Factory&#8221; is &#8220;Factory that creates related objects.&#8221;<\/h2>\n<p>If you are familiar with the factory design pattern in Java, you may observe that we utilize a single Factory class. This class returns different subclasses depending on the given input, and it employs if-else or switch statements to accomplish this. In the Abstract Factory pattern, we eliminate the need for if-else blocks and instead have a separate factory class for each subclass. Additionally, we have an Abstract Factory class that returns the appropriate subclass based on the input factory class. Initially, this may seem confusing, but once you examine the implementation, it becomes quite easy to understand and grasp the subtle differences between the Factory and Abstract Factory patterns. Similar to our previous post on the factory pattern, we will employ the same superclass and subclasses.<\/p>\n<h3>Superclasses and subclasses for the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Abstract_factory_pattern\">Abstract Factory Design Pattern<\/a>.<\/h3>\n<p>One possible paraphrase for &#8220;Computer.java&#8221; could be &#8220;Java file for a computer program.&#8221;<\/p>\n<pre class=\"post-pre\"><code>package com.scdev.design.model;\r\n \r\npublic abstract class Computer {\r\n     \r\n    public abstract String getRAM();\r\n    public abstract String getHDD();\r\n    public abstract String getCPU();\r\n     \r\n    @Override\r\n    public String toString(){\r\n        return \"RAM= \"+this.getRAM()+\", HDD=\"+this.getHDD()+\", CPU=\"+this.getCPU();\r\n    }\r\n}\r\n<\/code><\/pre>\n<p>On this page, you will find the PC class written in Java programming language.<\/p>\n<pre class=\"post-pre\"><code>package com.scdev.design.model;\r\n \r\npublic class PC extends Computer {\r\n \r\n    private String ram;\r\n    private String hdd;\r\n    private String cpu;\r\n     \r\n    public PC(String ram, String hdd, String cpu){\r\n        this.ram=ram;\r\n        this.hdd=hdd;\r\n        this.cpu=cpu;\r\n    }\r\n    @Override\r\n    public String getRAM() {\r\n        return this.ram;\r\n    }\r\n \r\n    @Override\r\n    public String getHDD() {\r\n        return this.hdd;\r\n    }\r\n \r\n    @Override\r\n    public String getCPU() {\r\n        return this.cpu;\r\n    }\r\n \r\n}\r\n<\/code><\/pre>\n<p>Java server<\/p>\n<pre class=\"post-pre\"><code>package com.scdev.design.model;\r\n \r\n \r\npublic class Server extends Computer {\r\n \r\n    private String ram;\r\n    private String hdd;\r\n    private String cpu;\r\n     \r\n    public Server(String ram, String hdd, String cpu){\r\n        this.ram=ram;\r\n        this.hdd=hdd;\r\n        this.cpu=cpu;\r\n    }\r\n    @Override\r\n    public String getRAM() {\r\n        return this.ram;\r\n    }\r\n \r\n    @Override\r\n    public String getHDD() {\r\n        return this.hdd;\r\n    }\r\n \r\n    @Override\r\n    public String getCPU() {\r\n        return this.cpu;\r\n    }\r\n \r\n}\r\n<\/code><\/pre>\n<h3>Creating a factory class for every subclass.<\/h3>\n<p>To begin with, it is essential to establish an interface or abstract class for the Abstract Factory called ComputerAbstractFactory.java.<\/p>\n<pre class=\"post-pre\"><code>package com.scdev.design.abstractfactory;\r\n\r\nimport com.scdev.design.model.Computer;\r\n\r\npublic interface ComputerAbstractFactory {\r\n\r\n\tpublic Computer createComputer();\r\n\r\n}\r\n<\/code><\/pre>\n<p>Take note that the createComputer() function is producing an instance of the Computer superclass. From now on, our factory classes will implement this interface and return the corresponding subclass. Specifically, in the case of PCFactory.java, it will return an instance of the sub-class related to PCs.<\/p>\n<pre class=\"post-pre\"><code>package com.scdev.design.abstractfactory;\r\n\r\nimport com.scdev.design.model.Computer;\r\nimport com.scdev.design.model.PC;\r\n\r\npublic class PCFactory implements ComputerAbstractFactory {\r\n\r\n\tprivate String ram;\r\n\tprivate String hdd;\r\n\tprivate String cpu;\r\n\t\r\n\tpublic PCFactory(String ram, String hdd, String cpu){\r\n\t\tthis.ram=ram;\r\n\t\tthis.hdd=hdd;\r\n\t\tthis.cpu=cpu;\r\n\t}\r\n\t@Override\r\n\tpublic Computer createComputer() {\r\n\t\treturn new PC(ram,hdd,cpu);\r\n\t}\r\n\r\n}\r\n<\/code><\/pre>\n<p>We will also create a factory class specifically for the Server subclass, called ServerFactory.java.<\/p>\n<pre class=\"post-pre\"><code>package com.scdev.design.abstractfactory;\r\n\r\nimport com.scdev.design.model.Computer;\r\nimport com.scdev.design.model.Server;\r\n\r\npublic class ServerFactory implements ComputerAbstractFactory {\r\n\r\n\tprivate String ram;\r\n\tprivate String hdd;\r\n\tprivate String cpu;\r\n\t\r\n\tpublic ServerFactory(String ram, String hdd, String cpu){\r\n\t\tthis.ram=ram;\r\n\t\tthis.hdd=hdd;\r\n\t\tthis.cpu=cpu;\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic Computer createComputer() {\r\n\t\treturn new Server(ram,hdd,cpu);\r\n\t}\r\n\r\n}\r\n<\/code><\/pre>\n<p>We will now establish a consumer class, ComputerFactory.java, which will serve as the starting point for client classes in order to generate sub-classes.<\/p>\n<pre class=\"post-pre\"><code>package com.scdev.design.abstractfactory;\r\n\r\nimport com.scdev.design.model.Computer;\r\n\r\npublic class ComputerFactory {\r\n\r\n\tpublic static Computer getComputer(ComputerAbstractFactory factory){\r\n\t\treturn factory.createComputer();\r\n\t}\r\n}\r\n<\/code><\/pre>\n<p>Take note that it is a basic class and the getComputer method accepts a ComputerAbstractFactory argument and returns a Computer object. At this stage, the implementation should become apparent. Now, let&#8217;s create a straightforward testing method and observe how the abstract factory is utilized to obtain instances of sub-classes. This will be referred to as TestDesignPatterns.java.<\/p>\n<pre class=\"post-pre\"><code>package com.scdev.design.test;\r\n\r\nimport com.scdev.design.abstractfactory.PCFactory;\r\nimport com.scdev.design.abstractfactory.ServerFactory;\r\nimport com.scdev.design.factory.ComputerFactory;\r\nimport com.scdev.design.model.Computer;\r\n\r\npublic class TestDesignPatterns {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\ttestAbstractFactory();\r\n\t}\r\n\r\n\tprivate static void testAbstractFactory() {\r\n\t\tComputer pc = com.scdev.design.abstractfactory.ComputerFactory.getComputer(new PCFactory(\"2 GB\",\"500 GB\",\"2.4 GHz\"));\r\n\t\tComputer server = com.scdev.design.abstractfactory.ComputerFactory.getComputer(new ServerFactory(\"16 GB\",\"1 TB\",\"2.9 GHz\"));\r\n\t\tSystem.out.println(\"AbstractFactory PC Config::\"+pc);\r\n\t\tSystem.out.println(\"AbstractFactory Server Config::\"+server);\r\n\t}\r\n}\r\n<\/code><\/pre>\n<p>The output of the program above will be:<\/p>\n<pre class=\"post-pre\"><code>AbstractFactory PC Config::RAM= 2 GB, HDD=500 GB, CPU=2.4 GHz\r\nAbstractFactory Server Config::RAM= 16 GB, HDD=1 TB, CPU=2.9 GHz\r\n<\/code><\/pre>\n<p>This is the class diagram that showcases the implementation of the abstract factory design pattern.<\/p>\n<h3>The advantages of using the Abstract Factory Design Pattern are as follows:<\/h3>\n<ul class=\"post-ul\">\n<li>Abstract Factory design pattern provides approach to code for interface rather than implementation.<\/li>\n<li>Abstract Factory pattern is \u201cfactory of factories\u201d and can be easily extended to accommodate more products, for example we can add another sub-class Laptop and a factory LaptopFactory.<\/li>\n<li>Abstract Factory pattern is robust and avoid conditional logic of Factory pattern.<\/li>\n<\/ul>\n<h3>Examples of the Abstract Factory Design Pattern in use within the JDK.<\/h3>\n<ul class=\"post-ul\">\n<li>javax.xml.parsers.DocumentBuilderFactory#newInstance()<\/li>\n<li>javax.xml.transform.TransformerFactory#newInstance()<\/li>\n<li>javax.xml.xpath.XPathFactory#newInstance()<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Welcome to the example of the Abstract Factory Design Pattern in Java. The Abstract Factory design pattern belongs to the group of Creational patterns. The Abstract Factory pattern is very similar to the Factory Pattern, with the main difference being that it functions as a factory of factories. One possible native paraphrase of &#8220;Abstract Factory&#8221; [&hellip;]<\/p>\n","protected":false},"author":12,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[1],"tags":[],"class_list":["post-1308","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Abstract Factory Design Pattern in Java - Blog - Silicon Cloud<\/title>\n<meta name=\"description\" content=\"the Abstract Factory Design Pattern in Java. The Abstract Factory design pattern belongs to the group of Creational patterns.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/blog\/abstract-factory-java-implementation\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Abstract Factory Design Pattern in Java\" \/>\n<meta property=\"og:description\" content=\"the Abstract Factory Design Pattern in Java. The Abstract Factory design pattern belongs to the group of Creational patterns.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/blog\/abstract-factory-java-implementation\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/SiliCloudGlobal\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-08-31T11:00:45+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-03-03T17:51:24+00:00\" \/>\n<meta name=\"author\" content=\"Liam\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@SiliCloudGlobal\" \/>\n<meta name=\"twitter:site\" content=\"@SiliCloudGlobal\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Liam\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/abstract-factory-java-implementation\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/abstract-factory-java-implementation\/\"},\"author\":{\"name\":\"Liam\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/23786905eb7b377f45ddb01c17da7671\"},\"headline\":\"Abstract Factory Design Pattern in Java\",\"datePublished\":\"2023-08-31T11:00:45+00:00\",\"dateModified\":\"2024-03-03T17:51:24+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/abstract-factory-java-implementation\/\"},\"wordCount\":519,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/#organization\"},\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/abstract-factory-java-implementation\/\",\"url\":\"https:\/\/www.silicloud.com\/blog\/abstract-factory-java-implementation\/\",\"name\":\"Abstract Factory Design Pattern in Java - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/#website\"},\"datePublished\":\"2023-08-31T11:00:45+00:00\",\"dateModified\":\"2024-03-03T17:51:24+00:00\",\"description\":\"the Abstract Factory Design Pattern in Java. The Abstract Factory design pattern belongs to the group of Creational patterns.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/abstract-factory-java-implementation\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/blog\/abstract-factory-java-implementation\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/abstract-factory-java-implementation\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.silicloud.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Abstract Factory Design Pattern in Java\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/blog\/\",\"name\":\"Silicon Cloud Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/#organization\"},\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#organization\",\"name\":\"Silicon Cloud Blog\",\"url\":\"https:\/\/www.silicloud.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.silicloud.com\/blog\/wp-content\/uploads\/2023\/11\/EN-SILICON-Full.png\",\"contentUrl\":\"https:\/\/www.silicloud.com\/blog\/wp-content\/uploads\/2023\/11\/EN-SILICON-Full.png\",\"width\":1024,\"height\":1024,\"caption\":\"Silicon Cloud Blog\"},\"image\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/SiliCloudGlobal\/\",\"https:\/\/twitter.com\/SiliCloudGlobal\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/23786905eb7b377f45ddb01c17da7671\",\"name\":\"Liam\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/8d37ed3e7f770dde8bf069ba0b4298688028c3abaacf1131742fc1352d174ebd?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/8d37ed3e7f770dde8bf069ba0b4298688028c3abaacf1131742fc1352d174ebd?s=96&d=mm&r=g\",\"caption\":\"Liam\"},\"sameAs\":[\"http:\/\/Wilson\"],\"url\":\"https:\/\/www.silicloud.com\/blog\/author\/liamwilson\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Abstract Factory Design Pattern in Java - Blog - Silicon Cloud","description":"the Abstract Factory Design Pattern in Java. The Abstract Factory design pattern belongs to the group of Creational patterns.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/blog\/abstract-factory-java-implementation\/","og_locale":"en_US","og_type":"article","og_title":"Abstract Factory Design Pattern in Java","og_description":"the Abstract Factory Design Pattern in Java. The Abstract Factory design pattern belongs to the group of Creational patterns.","og_url":"https:\/\/www.silicloud.com\/blog\/abstract-factory-java-implementation\/","og_site_name":"Blog - Silicon Cloud","article_publisher":"https:\/\/www.facebook.com\/SiliCloudGlobal\/","article_published_time":"2023-08-31T11:00:45+00:00","article_modified_time":"2024-03-03T17:51:24+00:00","author":"Liam","twitter_card":"summary_large_image","twitter_creator":"@SiliCloudGlobal","twitter_site":"@SiliCloudGlobal","twitter_misc":{"Written by":"Liam","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.silicloud.com\/blog\/abstract-factory-java-implementation\/#article","isPartOf":{"@id":"https:\/\/www.silicloud.com\/blog\/abstract-factory-java-implementation\/"},"author":{"name":"Liam","@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/23786905eb7b377f45ddb01c17da7671"},"headline":"Abstract Factory Design Pattern in Java","datePublished":"2023-08-31T11:00:45+00:00","dateModified":"2024-03-03T17:51:24+00:00","mainEntityOfPage":{"@id":"https:\/\/www.silicloud.com\/blog\/abstract-factory-java-implementation\/"},"wordCount":519,"commentCount":0,"publisher":{"@id":"https:\/\/www.silicloud.com\/blog\/#organization"},"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/blog\/abstract-factory-java-implementation\/","url":"https:\/\/www.silicloud.com\/blog\/abstract-factory-java-implementation\/","name":"Abstract Factory Design Pattern in Java - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/blog\/#website"},"datePublished":"2023-08-31T11:00:45+00:00","dateModified":"2024-03-03T17:51:24+00:00","description":"the Abstract Factory Design Pattern in Java. The Abstract Factory design pattern belongs to the group of Creational patterns.","breadcrumb":{"@id":"https:\/\/www.silicloud.com\/blog\/abstract-factory-java-implementation\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/blog\/abstract-factory-java-implementation\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/blog\/abstract-factory-java-implementation\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.silicloud.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Abstract Factory Design Pattern in Java"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/blog\/#website","url":"https:\/\/www.silicloud.com\/blog\/","name":"Silicon Cloud Blog","description":"","publisher":{"@id":"https:\/\/www.silicloud.com\/blog\/#organization"},"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.silicloud.com\/blog\/#organization","name":"Silicon Cloud Blog","url":"https:\/\/www.silicloud.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.silicloud.com\/blog\/wp-content\/uploads\/2023\/11\/EN-SILICON-Full.png","contentUrl":"https:\/\/www.silicloud.com\/blog\/wp-content\/uploads\/2023\/11\/EN-SILICON-Full.png","width":1024,"height":1024,"caption":"Silicon Cloud Blog"},"image":{"@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/SiliCloudGlobal\/","https:\/\/twitter.com\/SiliCloudGlobal"]},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/23786905eb7b377f45ddb01c17da7671","name":"Liam","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/8d37ed3e7f770dde8bf069ba0b4298688028c3abaacf1131742fc1352d174ebd?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/8d37ed3e7f770dde8bf069ba0b4298688028c3abaacf1131742fc1352d174ebd?s=96&d=mm&r=g","caption":"Liam"},"sameAs":["http:\/\/Wilson"],"url":"https:\/\/www.silicloud.com\/blog\/author\/liamwilson\/"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/posts\/1308","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/users\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/comments?post=1308"}],"version-history":[{"count":3,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/posts\/1308\/revisions"}],"predecessor-version":[{"id":1645,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/posts\/1308\/revisions\/1645"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/media?parent=1308"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/categories?post=1308"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/tags?post=1308"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}