抽象工厂类

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

//package com.cc;

import Java.util.*;

import java.lang.Class;

interface book{

void sayBookName();

void sayBookPrice();

}

class ChineseBook implements book //中文书

{

private String name;

private int price;

public ChineseBook(){

//this.ChineseBook("chinese",10);

name = "ChineseBook";

price = 10;

}

public ChineseBook(String name,int price){

this.name = name;

this.price = price;

}

public void sayBookName(){

System.out.println("i am a chinese book "+name);

}

public void sayBookPrice(){

System.out.println("my price is "+price);

}

//继续书店工厂

//

private static class Factory extends BookFactory //内部类的使用

{

protected book create(){

return new ChineseBook();

}

}

static { //生成1个实例后,就要把这个实例加到工厂中

System.out.println("loading ChineseBook.class");

BookFactory.addFactory("ChineseBook",new Factory()); //为什么要把工厂

//放到list中呢?便于加载一次以后可直接调用

}

}

class EnglishBook implements book //英文书

{

private String name;

private int price;

public EnglishBook(){

//this.EnglishBook("english",10);

name = "EnglisthBook";

price = 10;

}

public EnglishBook(String name,int price){

this.name = name;

this.price = price;

}

public void sayBookName(){

System.out.println("i am a english book "+name);

}

public void sayBookPrice(){

System.out.println("my price is "+price);

}

//继续书店工厂

//

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中呢?便于加载一次以后可直接调用

}

}

abstract class BookFactory

{

protected abstract book create(); //这个方法要在具体类中实现

private static Map factories = new HashMap(); //工厂map

public static void addFactory(String id,BookFactory f)

{

//加入工厂,将书和创建书的工厂加入到map中,为什么要加入创建书的工厂呢?

//因为创建书的工厂有个create()方法,他要具体返回一个实例

System.out.println(factories.put(id,f));

}

public static final book createBook(String id){//创建书实例,书的名称作为参数,传出的是被创建好的Book的实例

if (!factories.containsKey(id))//当工厂中不包含这个类时要装载

{

try{

// Load dynamically 动态装载

Class.forName(id); //怎么加载的?只要直接执行

//这个类,类就会调用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();

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航