Java設(shè)計(jì)模式之抽象工廠模式詳解
一、什么是抽象工廠模式
為創(chuàng)建一組相關(guān)或相互依賴的對(duì)象提供一個(gè)接口,而且無需指定他們的具體類,這稱之為抽象工廠模式(Abstract Factory)。我們并不關(guān)心零件的具體實(shí)現(xiàn),而是只關(guān)心接口(API)。我們僅使用該接口(API)將零件組裝稱為產(chǎn)品。
二、示例程序

1、抽象的零件:Item類
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類
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類
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類
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+"編寫完成");
} catch (IOException e) {
e.printStackTrace();
}
}
public abstract String makeHTML();
}
5、抽象的工廠:Factory類
package com.as.module.abstractfactory;
/**
* 抽象的工廠
* @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、具體的工廠:ListFactory類
package com.as.module.abstractfactory;
/**
* 具體的工廠
* @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類
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類
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類
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、抽象工廠方法測(cè)試用例
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("人民日?qǐng)?bào)","http://www.people.com.cn/");
Link gmw = factory.createLink("光明日?qǐng)?bào)","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("日?qǐng)?bào)");
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();
}
}
運(yùn)行結(jié)果:


三、UML
登場(chǎng)角色:
1、AbstractProduct(抽象產(chǎn)品)
AbstractProduct角色負(fù)責(zé)定義AbstractPFactory角色所生成的抽象零件和產(chǎn)品的接口。在示例程序中,由Link類,Tray類和Page類扮演此角色
2、AbstractFactory(抽象工廠)
AbstractFactory角色負(fù)責(zé)定義用于生成抽象產(chǎn)品的接口。在示例程序中,由Factory
3、Client(委托者)
Client角色僅會(huì)調(diào)用AbstractProduct角色和AbstractFactory角色來進(jìn)行工作,對(duì)于具體的零件,產(chǎn)品,工廠一無所知。示例程序中,由具體的TestAbstractFactory 扮演此角色
4、ConcreteProduct(具體產(chǎn)品)
ConcreteProduct角色負(fù)責(zé)實(shí)現(xiàn)抽象產(chǎn)品角色的接口,示例程序中,由ListLink,ListTray,ListPage類扮演此角色
5、ConcreteFactory(具體工廠)
到此這篇關(guān)于Java設(shè)計(jì)模式之抽象工廠模式詳解的文章就介紹到這了,更多相關(guān)Java抽象工廠模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java創(chuàng)建型設(shè)計(jì)模式之抽象工廠模式(Abstract?Factory)
- Java設(shè)計(jì)模式之抽象工廠模式淺析講解
- Java設(shè)計(jì)模式之抽象工廠模式(Abstract?Factory)
- Java?深入理解創(chuàng)建型設(shè)計(jì)模式之抽象工廠模式
- 深入理解Java設(shè)計(jì)模式之抽象工廠模式
- Java設(shè)計(jì)模式之簡(jiǎn)單工廠 工廠方法 抽象工廠深度總結(jié)
- Java設(shè)計(jì)模式之工廠模式分析【簡(jiǎn)單工廠、工廠方法、抽象工廠】
- Java設(shè)計(jì)模式之抽象工廠模式
- Java設(shè)計(jì)模式筆記之抽象工廠代碼示例
- Java設(shè)計(jì)模式之抽象工廠模式實(shí)例詳解
- Java設(shè)計(jì)模式編程中簡(jiǎn)單工廠與抽象工廠模式的使用實(shí)例
- Java設(shè)計(jì)模式編程中的工廠方法模式和抽象工廠模式
- Java設(shè)計(jì)模式之工廠方法和抽象工廠
相關(guān)文章
看動(dòng)畫學(xué)算法之Java實(shí)現(xiàn)doublyLinkedList
這篇文章主要介紹Java實(shí)現(xiàn)doublyLinkedList,LinkedList:doublyLinkedList相對(duì)比較復(fù)雜,今天就來簡(jiǎn)單學(xué)習(xí)一下doublyLinkedList的基本操作和概,感興趣的小伙伴可以參考下面具體文章內(nèi)容2021-10-10
如何利用Java?AWT?創(chuàng)建一個(gè)簡(jiǎn)易計(jì)算器
這篇文章主要介紹了如何利用Java?AWT?創(chuàng)建一個(gè)簡(jiǎn)易計(jì)算器,AWT?是一個(gè)有助于構(gòu)建?GUI?的?API?基于?java?應(yīng)用程序,下面關(guān)于其相關(guān)資料實(shí)現(xiàn)計(jì)算器的內(nèi)容詳細(xì),需要的朋友可以參考一下2022-03-03
System.getProperty(user.dir)定位問題解析
System.getProperty(user.dir) 獲取的是啟動(dòng)項(xiàng)目的容器位置,用IDEA是項(xiàng)目的根目錄,部署在tomcat上是tomcat的啟動(dòng)路徑,即tomcat/bin的位置,這篇文章主要介紹了System.getProperty(user.dir)定位問題,需要的朋友可以參考下2023-05-05
spring整合JMS實(shí)現(xiàn)同步收發(fā)消息(基于ActiveMQ的實(shí)現(xiàn))
本篇文章主要介紹了spring整合JMS實(shí)現(xiàn)同步收發(fā)消息(基于ActiveMQ的實(shí)現(xiàn)),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
Jenkins自動(dòng)構(gòu)建部署項(xiàng)目到遠(yuǎn)程服務(wù)器上的方法步驟
這篇文章主要介紹了Jenkins自動(dòng)構(gòu)建部署項(xiàng)目到遠(yuǎn)程服務(wù)器上的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
springboot全局字符編碼設(shè)置方式(解決亂碼問題)
這篇文章主要介紹了springboot全局字符編碼設(shè)置方式(解決亂碼問題),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
Java使用Thread和Runnable的線程實(shí)現(xiàn)方法比較
這篇文章主要介紹了Java使用Thread和Runnable的線程實(shí)現(xiàn)方法,結(jié)合實(shí)例形式對(duì)比分析了Java使用Thread和Runnable實(shí)現(xiàn)與使用線程的相關(guān)操作技巧,需要的朋友可以參考下2019-10-10

