• 图解设计模式-Abstract Factory模式


    抽象工厂的工作是将“抽象零件”组装成“抽象产品”。
    我们不关心零件的具体实现,而是只关心接口API。我们仅适用该接口API将零件组装成为产品。
     
    角色:
    AbstractProduct抽象产品:负责定义AbstractFactory角色所生成的抽象零件和产品的接口。在示例中,友Link、Tray、Page类扮演。
    AbstractFactory抽象工厂:负责定义用于生成抽象产品的API接口,在示例中,有Factory扮演。
    Client委托者:该角色仅会调用AbstractProduct角色和AbstractFactory角色的接口API来进行工作。在示例中由Main类扮演。
    ConcreteProduct具体产品:负责实现AbstractProduct角色的API接口。在示例中由listfactory包下的ListLink、ListTray、ListPage类与tablefactory包下的TableLink、TableTray、TablePage类来扮演。
    ConcreteFactory具体工厂:负责实现AbstractFactory角色的API接口,在示例中,由listfactory包下的ListFactory与tablefactory包下的TableFactory类扮演。
    优点:
    易于增加具体的工厂:只需要Factory、Link、Tray、Page四个类即可。
     
    代码:
    public abstract class Item {
        protected String caption;
    
        public Item(String caption) {
            this.caption = caption;
        }
    
        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 Tray extends Item {
    
        protected List trayList = new ArrayList();
    
        public Tray(String caption) {
            super(caption);
        }
    
        public void add(Item item) {
            trayList.add(item);
        }
    }
    public abstract class Page{
        protected String author;
        protected String title;
        protected List content = new ArrayList();
    
        public Page(String author,String title) {
            this.title = title;
            this.author = author;
        }
    
        public void add(Item item){
            content.add(item);
        }
    
        public void out() {
            String filename = "D:\"+title+".html";
            try {
                PrintWriter printWriter = new PrintWriter(new FileWriter(filename));
                printWriter.println(this.makeHTML());
                printWriter.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        public abstract String makeHTML();
    
    }
    public abstract class Factory {
        public static Factory getFactory(String classname) {
            Factory factory = null;
            try {
                factory = (Factory) Class.forName(classname).newInstance();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            }
            return factory;
        }
    
        public abstract Link createLink(String caption,String url);
        public abstract Tray createTray(String caption);
        public abstract Page createPage(String author,String title);
    }
    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 ListTray extends Tray {
        public ListTray(String caption) {
            super(caption);
        }
    
        @Override
        public String makeHTML() {
            StringBuilder builder = new StringBuilder();
            builder.append("
    ");
            Iterator iterator = trayList.iterator();
            while(iterator.hasNext()){
                Item item = (Item) iterator.next();
                builder.append(item.makeHTML());
            }
            return builder.toString();
        }
    }
    public class ListPage extends Page {
        public ListPage(String author, String title) {
            super(author, title);
        }
    
        @Override
        public String makeHTML() {
            StringBuilder builder = new StringBuilder();
            builder.append(title);
            builder.append(author);
            Iterator iterator = content.iterator();
            while(iterator.hasNext()) {
                Item item = (Item) iterator.next();
                builder.append(item.makeHTML());
            }
            return builder.toString();
        }
    }
    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 author, String title) {
            return new ListPage(author,title);
        }
    }
    public class Main {
        public static void main(String[] args) {
            Factory factory = ListFactory.getFactory("listfactory.ListFactory");
            Link link = factory.createLink("111","222");
            Tray tray = factory.createTray("33");
            Page page = factory.createPage("作者","标题");
            page.add(link);
            page.add(tray);
            page.out();
        }
    }
    重点:
    Factory抽象类,通过className获得具体的类实例,可以灵活的获得继承Factory的实现类。
    同时Factory抽象类提供了创建Link、Tray、Page的抽象方法。
    ListFactory为实现了Factory的具体工厂,在ListFactory中定义了具体的使用哪些零件。
    Page抽象类定义了out输出方法,在out输出方法中调用了抽象方法makeHTML方法,后续实现了Page的类可以根据需要自己定义个性化的makeHTML方法。
    收藏文章数量从多到少与“把书读薄”是一个道理
  • 相关阅读:
    React篇-子组件调用父组件方法,并传值
    RN-ios模拟器上调出中文输入法
    mac-破解2018 webstorm
    React篇-滚动条下移的触发在react的生命周期分析
    javascript篇-typeof,instanceof,constructor,toString判断数据类型的用法和区别
    javascript篇-slice(),splice(),split(),substring(),substr()的用法以及区别
    javascript篇-console.log()打印object却显示为字符串[object object]
    Linux的几种关机命令
    深入浅出Oracle:DBA入门、进阶与诊断案例 PDF 下载
    SQL state [72000]; error code [1461]; ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值 ; nested exception is java.sql.BatchUpdateException: ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值
  • 原文地址:https://www.cnblogs.com/use-D/p/9581938.html
Copyright © 2020-2023  润新知