class ChineseBook implements book //中文書 { private String name; private int price; public ChineseBook(){ //this.ChineseBook("chinese",10); name = "ChineseBook"; price = 10; }
public void sayBookName(){ System.out.println("i am a chinese book "+name); }
public void sayBookPrice(){ System.out.println("my price is "+price); } //繼續(xù)書店工廠 // private static class Factory extends BookFactory //內(nèi)部類的使用 { protected book create(){ return new ChineseBook(); } } static { //生成1個實例后,就要把這個實例加到工廠中 System.out.println("loading ChineseBook.class"); BookFactory.addFactory("ChineseBook",new Factory()); //為什么要把工廠 //放到list中呢?便于加載一次以后可直接調(diào)用 } }
class EnglishBook implements book //英文書 { private String name; private int price; public EnglishBook(){ //this.EnglishBook("english",10); name = "EnglisthBook"; price = 10; }
public void sayBookName(){ System.out.println("i am a english book "+name); }
public void sayBookPrice(){ System.out.println("my price is "+price); }
//繼續(xù)書店工廠 // private static class Factory extends BookFactory { protected book create(){ return new EnglishBook(); } } static { //生成1個實例后,就要把這個實例加到工廠中 System.out.println("loading EnglishBook.class"); BookFactory.addFactory("EnglishBook",new Factory()); //為什么要把工廠 //放到list中呢?便于加載一次以后可直接調(diào)用 } }
abstract class BookFactory { protected abstract book create(); //這個方法要在具體類中實現(xiàn) private static Map factories = new HashMap(); //工廠map public static void addFactory(String id,BookFactory f) { //加入工廠,將書和創(chuàng)建書的工廠加入到map中,為什么要加入創(chuàng)建書的工廠呢? //因為創(chuàng)建書的工廠有個create()方法,他要具體返回一個實例 System.out.println(factories.put(id,f)); } public static final book createBook(String id){//創(chuàng)建書實例,書的名稱作為參數(shù),傳出的是被創(chuàng)建好的Book的實例 if (!factories.containsKey(id))//當(dāng)工廠中不包含這個類時要裝載 { try{ // Load dynamically 動態(tài)裝載 Class.forName(id); //怎么加載的?只要直接執(zhí)行 //這個類,類就會調(diào)用static里的語句 }catch(ClassNotFoundException e){ throw new RuntimeException("error"+id); } // See if it was put in 看看它是否被裝載 if(!factories.containsKey(id))throw new RuntimeException("Bad shape creation: " + id); } return ((BookFactory)factories.get(id)).create(); } }
public class BookFactory2 { String bookList[] = {"EnglishBook", "ChineseBook","EnglishBook","ChineseBook","ChineseBook","EnglishBook"}; List books = new ArrayList();
public void test(){ for (int i=0;i<bookList.length;i++) { books.add(BookFactory.createBook(bookList)); System.out.println("already create"); } Iterator it = books.iterator(); while(it.hasNext()){ book s = (book)it.next(); s.sayBookName(); } } public static void main(String args[]) { new BookFactory2().test(); } }