抽象工厂模式(Abstract Factory)

Abstract Factory?

抽象工厂的工作是将“抽象零件”组装为“抽象产品”。在template method模式中由与顶级父类提供算法实现,但在Factory Method 中也是定义好framework中具体的Product与Factory,并且由与子类去实现具体的工厂 产品实现,但是抽象工厂中,多个多个构件的之间组装的例子,并且使用抽象类满足隔离的实现。基本上你可以看作是工厂方法的扩展。

  • 假设现在我们要在示例程序中增加新的具体工厂,那么需要做的就是编写Factory、Link、Tray、Page这4个类的子类,并实现它们定义的抽象方法。也就是说将factory包中的抽象部分全部具体化即可。便于添加新的职责

相关设计模式:
◆Builder模式:Abstract Factory模式通过调用抽象产品的接口(API)来组装抽象产品,生成具有复杂结构的实例。
Builder模式则是分阶段地制作复杂实例。·Factory Method模式 有时Abstract Factory 模式中零件和产品的生成会使用到Factory Method模式。
·Composite模式 有时Abstract Factory模式在制作产品时会使用Composite模式。
·Singleton模式 有时Abstract Factory模式中的具体工厂会使用Singleton模式。

具体职责

abstrack:
factory |Factory| 表示抽象工厂的类(制作Link、Tray、Page)
factory |Item| 方便统一处理Link和Tray的类
factory |Link 抽象零件:表示HTML的链接的类
factory |Tray|抽象零件:表示含有Link和Tray的类
factory |Page抽象零件:表示HTML页面的类
|无名|Main测试程序行为的类
ConcreteClass:
|listfactory |ListFactory |表示具体工厂的类(制作ListLink、ListTray、ListPage)
|1istfactory |ListLink 具体零件:表示HTML的链接的类
|1istfactory |ListTray |具体零件:表示含有Link和Tray的类
|1istfactory |ListPage |具体零件:表示HTML页面的类

UML

文件结构:

Code

AbstractFactory:

public  abstract class AbstractFactory {

    /**
     * 根据类名进行装载
     * @param name
     * @return
     */
    public static AbstractFactory getFactory(String name){

            AbstractFactory factory=null;
            try {

                Class<?> aClass = Class.forName(name);
                factory= ((AbstractFactory) aClass.newInstance());
            }catch (ClassNotFoundException e){
                e.printStackTrace();
            }catch (Exception e){
                e.printStackTrace();
            }
            return factory;
    }

    /**
     * 相应需要抽象的实例
     * @param caption
     * @return
     */
    public abstract Tray createTray(String caption);

    public abstract Page createPage(String title, String author);

    public abstract Link createLink(String caption,String url);

}

顶级Item:

public abstract class Item {

    protected String caption;

    public Item(String caption) {
        this.caption = caption;
    }
    /**
     *  返回html的内容
     */
    public abstract String makeHtml();
}
三个子构件:
public abstract class Link extends Item{

    protected String url;

    public Link(String caption,String url) {
        super(caption);
        this.url=url;
    }
}
public  abstract class Page {
    protected String title;
    protected String author;

    protected Vector<Item> pages=new Vector<>();

    public Page(String title, String author) {
        this.title = title;
        this.author = author;
    }

    public void add(Item item){
        pages.add(item);
    }

    public void ouput(){
        String filename=title+".html";
        try {
           Writer writer=new PrintWriter(filename);
            writer.write(this.makeHtml());
            writer.close();
            System.out.println("编写HTMl文档完成");
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    /**
     *  输出html 文档
     * @return
     */
    protected abstract String makeHtml();

}
public abstract class Tray extends Item{

    protected Vector<Item> tray=new Vector<>();

    public Tray(String caption) {
        super(caption);
    }

    public void add(Item item){
        tray.add(item);
    }
}

具体工厂的实现:

public class ListFactory extends AbstractFactory {

    @Override
    public Tray createTray(String caption) {
        return new ListTray(caption);
    }

    @Override
    public Page createPage(String title, String author) {
        return new ListPage(title,author);
    }

    @Override
    public Link createLink(String caption, String url) {
        return new ListLink(caption,url);
    }
}

具体的子构件的实现:
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>
";
    }
}
public class ListPage extends Page {

    public ListPage(String title, String author) {
        super(title, author);
    }

    @Override
    protected String makeHtml() {
        StringBuffer buffer=new StringBuffer();

        buffer.append("<html><head><title>"+title+"</title></head>
");
        buffer.append("<body>
");
        buffer.append("<h1>"+title+"</h1>
");
        buffer.append("<ul>
");
        Iterator<Item> iterator = pages.iterator();
        while(iterator.hasNext()){
            Item item = iterator.next();
            buffer.append(item.makeHtml());
        }
        buffer.append("</ul>
");
        buffer.append("<hr><address>"+author+"</address>
");
        buffer.append("</body></html
");

        return buffer.toString();
    }
}
public class ListTray extends Tray {

    public ListTray(String caption) {
        super(caption);
    }

    @Override
    public String makeHtml() {

        StringBuffer buffer = new StringBuffer();

        buffer.append("<li>
");
        buffer.append(caption+"
");
        buffer.append("<ul>
");
        Iterator<Item> iterator = tray.iterator();
        while (iterator.hasNext()){
            Item item = iterator.next();
            buffer.append(item.makeHtml());
        }
        buffer.append("</ul>
");
        buffer.append("</li>
");

        return buffer.toString();
    }
}

测试:


public class MainTest {


    public static void main(String[] args) {

        /**
         * 根据不同的args入参选择不同的工厂实现
         */
        args=new String[]{"abstractfactory.base.factory.absfactory.concretefactory.ListFactory"};
        // 实现2
        args=new String[]{"abstractfactory.base.factory.absfactory.concreatefactory2.TableFactory"};
        if(args.length!=1){

            System.out.println("example : java Main package.ConcreateFactory1");
            System.out.println("example : java Main package.ConcreateFactory2");
            System.exit(0);
        }
        AbstractFactory factory = AbstractFactory.getFactory(args[0]);

        Link google = factory.createLink("谷歌", "www.google.cn");
        Link baidu = factory.createLink("百度", "www.baidu.com");


        Link souhu = factory.createLink("搜狐", "http://www.sohu.com/");
        Link sina = factory.createLink("新浪", "https://www.sina.com.cn/");
        Link gome = factory.createLink("国美", "https://www.gome.com.c");
        Link wangyi = factory.createLink("网易", "https://www.163.com/");

        Tray reserchtray = factory.createTray("搜索引擎");

        reserchtray.add(google);
        reserchtray.add(baidu);


        Tray chinaItCompany = factory.createTray("china IT Company");

        chinaItCompany.add(souhu);
        chinaItCompany.add(sina);
        chinaItCompany.add(gome);
        chinaItCompany.add(wangyi);

        Page page = factory.createPage("网址导航", "by dgw");

        page.add(reserchtray);
        page.add(chinaItCompany);

        page.ouput();


    }

}
原文地址:https://www.cnblogs.com/dgwblog/p/9778995.html