- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > 編程語(yǔ)言 >
- Java設計模式之抽象工廠(chǎng)模式詳解
為創(chuàng )建一組相關(guān)或相互依賴(lài)的對象提供一個(gè)接口,而且無(wú)需指定他們的具體類(lèi),這稱(chēng)之為抽象工廠(chǎng)模式(Abstract Factory)。我們并不關(guān)心零件的具體實(shí)現,而是只關(guān)心接口(API)。我們僅使用該接口(API)將零件組裝稱(chēng)為產(chǎn)品。
1、抽象的零件:Item類(lèi)
package com.as.module.abstractfactory; /** * 抽象的零件 * @author Andy * @date 2021/4/29 23:16 */ public abstract class Item { protected String caption; public Item(String caption) { this.caption = caption; } public abstract String makeHTML(); }
2、抽象的零件:Link類(lèi)
package com.as.module.abstractfactory; /** * TODO * * @author Andy * @date 2021/4/29 23:18 */ public abstract class Link extends Item { protected String url; public Link(String caption,String url) { super(caption); this.url = url; } }
3、抽象的零件:Tray類(lèi)
package com.as.module.abstractfactory; import java.util.ArrayList; /** * TODO * * @author Andy * @date 2021/4/29 23:20 */ public abstract class Tray extends Item{ protected ArrayList tray = new ArrayList(); public Tray(String caption) { super(caption); } public void add(Item item){ tray.add(item); } }
4、抽象的產(chǎn)品:Page類(lèi)
package com.as.module.abstractfactory; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import java.util.ArrayList; /** * 抽象的產(chǎn)品 * @author Andy * @date 2021/4/29 23:22 */ public abstract class Page { protected String title; protected String author; protected ArrayList content = new ArrayList(); public Page(String title, String author) { this.title = title; this.author = author; } public void add(Item item){ content.add(item); } public void output(){ String filename = title+".html"; try { Writer writer = new FileWriter(filename); writer.write(this.makeHTML()); writer.close(); System.out.println(filename+"編寫(xiě)完成"); } catch (IOException e) { e.printStackTrace(); } } public abstract String makeHTML(); }
5、抽象的工廠(chǎng):Factory類(lèi)
package com.as.module.abstractfactory; /** * 抽象的工廠(chǎng) * @author Andy * @date 2021/4/29 23:31 */ public abstract class Factory { public static Factory getFactory(String className){ Factory factory = null; try { factory = (Factory)Class.forName(className).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return factory; } public abstract Link createLink(String caption,String url); public abstract Tray createTray(String caption); public abstract Page createPage(String title,String author); }
6、具體的工廠(chǎng):ListFactory類(lèi)
package com.as.module.abstractfactory; /** * 具體的工廠(chǎng) * @author Andy * @date 2021/4/29 23:36 */ public class ListFactory extends Factory { @Override public Link createLink(String caption, String url) { return new ListLink(caption,url); } @Override public Tray createTray(String caption) { return new ListTray(caption); } @Override public Page createPage(String title, String author) { return new ListPage(title,author); } }
7、具體的零件:ListLink類(lèi)
package com.as.module.abstractfactory; /** * 具體的零件 * @author Andy * @date 2021/4/29 23:37 */ public class ListLink extends Link{ public ListLink(String caption,String url) { super(caption,url); } @Override public String makeHTML() { return "<li><a href=\">"+url+"\">"+caption+"</a></li>\n"; } }
8、具體的零件:ListTray類(lèi)
package com.as.module.abstractfactory; import java.util.Iterator; /** * TODO * * @author Andy * @date 2021/4/29 23:43 */ public class ListTray extends Tray { public ListTray(String caption) { super(caption); } @Override public String makeHTML() { StringBuffer buffer = new StringBuffer(); buffer.append("<li>\n"); buffer.append(caption+"\n"); buffer.append("<ul>\n"); Iterator it = tray.iterator(); while(it.hasNext()){ Item item = (Item)it.next(); buffer.append(item.makeHTML()); } buffer.append("</ul>\n"); buffer.append("</li>\n"); return buffer.toString(); } }
9、具體的零件:ListPage類(lèi)
package com.as.module.abstractfactory; import java.util.Iterator; /** * 具體的產(chǎn)品 * @author Andy * @date 2021/5/4 10:42 */ public class ListPage extends Page { public ListPage(String title, String author) { super(title, author); } @Override public String makeHTML() { StringBuffer buffer = new StringBuffer(); buffer.append("<html><head><title>"+title+"</title></head>\n"); buffer.append("<body>\n"); buffer.append("<h1>"+title+"</h1>\n"); buffer.append("<ul>\n"); Iterator it = content.iterator(); while(it.hasNext()){ Item item = (Item)it.next(); buffer.append(item.makeHTML()); } buffer.append("</ul>\n"); buffer.append("<hr><address>"+author+"</address>"); buffer.append("</body></html>\n"); return buffer.toString(); } }
10、抽象工廠(chǎng)方法測試用例
package com.as.module.abstractfactory; import java.util.List; /** * * @author Andy * @date 2021/5/4 10:54 */ public class TestAbstractFactory { public static void main(String[] args) { Factory factory = Factory.getFactory("com.as.module.abstractfactory.ListFactory"); Link people = factory.createLink("人民日報","http://www.people.com.cn/"); Link gmw = factory.createLink("光明日報","http://www.gmw.cn/"); Link baidu = factory.createLink("Baidu","http://www.baidu.com/"); Link google = factory.createLink("Google","http://www.google.com/"); Tray traynews = factory.createTray("日報"); traynews.add(people); traynews.add(gmw); Tray traysearch = factory.createTray("搜索引擎"); traysearch.add(baidu); traysearch.add(google); Page page = factory.createPage("LinkPage","Andy"); page.add(traynews); page.add(traysearch); page.output(); } }
運行結果:
登場(chǎng)角色:
1、AbstractProduct(抽象產(chǎn)品)
AbstractProduct角色負責定義AbstractPFactory角色所生成的抽象零件和產(chǎn)品的接口。在示例程序中,由Link類(lèi),Tray類(lèi)和Page類(lèi)扮演此角色
2、AbstractFactory(抽象工廠(chǎng))
AbstractFactory角色負責定義用于生成抽象產(chǎn)品的接口。在示例程序中,由Factory
3、Client(委托者)
Client角色僅會(huì )調用AbstractProduct角色和AbstractFactory角色來(lái)進(jìn)行工作,對于具體的零件,產(chǎn)品,工廠(chǎng)一無(wú)所知。示例程序中,由具體的TestAbstractFactory 扮演此角色
4、ConcreteProduct(具體產(chǎn)品)
ConcreteProduct角色負責實(shí)現抽象產(chǎn)品角色的接口,示例程序中,由ListLink,ListTray,ListPage類(lèi)扮演此角色
5、ConcreteFactory(具體工廠(chǎng))
到此這篇關(guān)于Java設計模式之抽象工廠(chǎng)模式詳解的文章就介紹到這了,更多相關(guān)Java抽象工廠(chǎng)模式內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站