Java设计模式之抽象工厂
什么是抽象工厂?
抽象工厂的工作是将“抽象零件” 组装为“抽象产品”,
它指的是“不考虑具体怎样实现, 而是仅关注接口 ( APT )" 的状态。在 Abstract Factory 模式中将会出现抽象工厂, 它会将抽象零件组装为抽象产品。也就是说, 我们井不关心零件的具体实现, 而是只关心接口( API )。我们仅使用该接口 ( API ) 将零件组装成为产品
类说明
有什么有点和不足?
优点
容易增加具体得工厂
不足
增加新的产品比较费事
代码
Factory
public abstract class Factory {
public static Factory getFactory(String classname) {
Factory factory = null;
try {
factory = (Factory) Class.forName(classname).newInstance();
} catch (ClassNotFoundException e) {
System.out.println("没有找到类:"+classname);
} catch (Exception e){
e.printStackTrace();
}
return factory;
}
public abstract Link ceateLink(String caption,String url);
public abstract Tray ceateTray(String caption);
public abstract Page ceatePage(String title,String author);
}
Item
public abstract class Item {
protected String caption;
public Item(String caption) {
super();
this.caption = caption;
}
public abstract String makeHTML();
}
Link
public abstract class Link extends Item{
protected String url;
public Link(String caption,String url) {
super(caption);
this.url = url;
}
}
Tray
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);
}
}
Page
public abstract class Page {
protected String title;
protected String author;
protected ArrayList content = new ArrayList<>();
public Page(String title, String author) {
super();
this.title = title;
this.author = author;
}
public void add(Item item) {
content.add(item);
}
public void output() {
try {
String fileName = title+".html";
Writer writer = new FileWriter(fileName);
writer.write(this.makeHTML());
writer.close();
System.out.println(fileName + "编写完成");
} catch (Exception e) {
}
}
public abstract String makeHTML();
}
ListFactory
public class ListFactory extends Factory{
@Override
public Link ceateLink(String caption, String url) {
return new ListLink(caption,url);
}
@Override
public Tray ceateTray(String caption) {
return new ListTray(caption);
}
@Override
public Page ceatePage(String title, String author) {
return new ListPage(title,author);
}
}
ListLink
public class ListLink extends Link{
public ListLink(String caption, String url) {
super(caption, url);
}
public String makeHTML() {
return "<li><a href =\" " + url + "\">" + caption + "</a></li>\n ";
}
}
ListPage
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(" <hl> " + title + "</hl >\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();
}
}
ListTray
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();
}
}
TableFactory
public class TableFactory extends Factory{
@Override
public Link ceateLink(String caption, String url) {
return new TableLink(caption,url);
}
@Override
public Tray ceateTray(String caption) {
return new TableTray(caption);
}
@Override
public Page ceatePage(String title, String author) {
return new TablePage(title,author);
}
}
TableLink
public class TableLink extends Link{
public TableLink(String caption, String url) {
super(caption, url);
}
@Override
public String makeHTML() {
return "<td><a href =\"" + url + "\">" + caption + "</a></td>\n";
}
}
TablePage
public class TablePage extends Page{
public TablePage(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("<hl>"+title+"</hl >\n" ) ;
buffer.append("<table width=\"80%\" border=\"3\">\n");
Iterator it= content.iterator();
while (it.hasNext ()) {
Item item= (Item)it.next();
buffer.append(" <tr>" + item.makeHTML() + " </tr>" ) ;
}
buffer.append("</table>\n");
buffer.append("<hr><address>" +author+ "</ a d d r e s s >" ) ;
buffer.append("</body></html>\n");
return buffer. toString ();
}
}
TableTray
public class TableTray extends Tray{
public TableTray(String caption) {
super(caption);
}
@Override
public String makeHTML() {
StringBuffer buffer= new StringBuffer() ;
buffer.append ( " <td>" ) ;
buffer.append("<table width=\" 100%\" border =\" l \"><tr>" ) ;
buffer.append( " <td bgcolor =\"#cccccc \"align=\"center\" colspan=\" "+ tray.size () + "\"><b>" +caption+ "</b></td>" ) ;
buffer.append("</tr> \n" ) ;
buffer.append("<tr> \n" ) ;
Iterator it= tray.iterator();
while (it.hasNext()) {
Item item = (Item)it.next() ;
buffer.append (item. makeHTML ()) ;
}
buffer.append(" </ tr></table>" ) ;
buffer.append( " </td> " ) ;
return buffer.toString() ;
}
}
运行结果