国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

Java設計模式之抽象工廠(chǎng)模式詳解

發(fā)布時(shí)間:2021-07-17 21:51 來(lái)源:腳本之家 閱讀:0 作者:安_shuai 欄目: 編程語(yǔ)言 歡迎投稿:712375056

目錄

一、什么是抽象工廠(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();
 
    }
}

運行結果:

三、UML

登場(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í)歡迎投稿傳遞力量。

色婷婷久久综合中文久久一本 | 亚洲精品在看在线观看高清| 麻豆国产AV丝袜白领传媒| 亚洲综合成人无码一区| 污污污污污污WWW网站免费| 久久精品人人槡人妻人人玩AV|