對簡單工廠的特殊情況進行測試——工廠角色與具體產品角色合并
代碼如下:
abstract class AbstractClass{
private static String name;
public final static AbstractClass format(String value){
name = value;
return new Embody();
}
public String getMsg(){
return name;
}
public abstract void fun1();
}
class Embody extends AbstractClass{
public void fun1(){
System.out.println("the enbody extends AbstractClass" + getMsg());
}
}
public class tt {
public static void main(String args[]){
AbstractClass.format("name").fun1();
}
}
上面的代碼中通過工廠方法把子類具體的實例化隱藏了起來。
下面是對一個普通的簡單工廠模式的實現:
代碼測試:
package sky;
//產品抽象類
abstract class People{
public String name; //名字
public String occuptationl; //職業
abstract public String getMsg();
}
//學生類——具體產品
class Student extends People{
private String name;
private String occupation;
private String grade;
public Student(String name,String occupation){
this.name = name;
this.occupation = occupation;
}
public void setGrade(String grade){
this.grade = grade;
}
public String getGrade(){
return grade;
}
public String getMsg(){
return getOccupation()+getName()+getGrade();
}
public String getOccupation(){
return occupation;
}
public String getName(){
return name;
}
}
//教師類——具體產品類
class Teacherextends People{
private String name;
private String occupation;
private int wage;
public Teacher(String name,String occupation){
this.name = name;
this.occupation = occupation;
}
public void setWage(int wage){
this.wage = wage;
}
public String getMsg(){
return getOccupation()+getName() + getWage();
}
public String getOccupation(){
return occupation;
}
public String getName(){
return name;
}
public int getWage(){
return wage;
}
}
//工廠類
class factory{
public static People build(String name,String occupation) throws BadPeopleException{
if(occupation.equals("student")){
return new Student(name,occupation);
}
else if(occupation.equals("teacher")){
return new Teacher(name,occupation);
}else{
throw new BadPeopleException("can not found the people");
}
}
}
//異常處理
class BadPeopleException extends Exception{
public BadPeopleException(String msg){
super(msg);
}
}
public class test{
public static void main(String args[]){
try {
Student t = (Student) factory.build("sky","student");
//從這個顯示轉換申明中我并沒有看到簡單工廠的好處
factory.build("fly","teacher");
/*難道只有這樣才可以看到它的優點嗎?——能夠避免客戶決定什么時候創建哪個實例*/
t.setGrade("three");
System.out.println(t.getMsg());
} catch (BadPeopleException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
問題:接口和抽象類的區別在哪里?
第13章 工廠方法模式 <java與模式> ---電子書 page146
組成為:抽象工廠、具體工廠、抽象產品、具體產品
其中抽象工廠是為外部訪問內部的一個接口,它的好處是可以通過擴張具體產品和具體工廠而不用改變客戶端的代碼.
一個簡單的測試代碼如下:
interface Fruit{
void grow();
void harvest();
}
class Apple implements Fruit{
private int treeNumber;
public void grow(){
System.out.println("Apple.grow()");
}
public void harvest(){
System.out.println("Apple.harvest()");
}
public void setTreeNumber(int number){
treeNumber = number;
}
public int getTreeNumber(){
return treeNumber;
}
}
class StrawBerry implements Fruit{
public void grow(){
System.out.println("StrawBerry.grow()");
}
public void harvest(){
System.out.println("StrawBerry.harvest()");
}
}
abstract class Gardener{
abstract public Fruit product();
}
class AppleGardener extends Gardener{
public Fruit product(){
return new Apple();
}
}
class StrawBerryGardener extends Gardener{
public Fruit product(){
return new StrawBerry();
}
}
public class Client {
public static void main(String args[]){
Fruit apple,strawberry;
AppleGardener applegarder = new AppleGardener();
StrawBerryGardener strawberrygarder = new StrawBerryGardener();
apple = applegarder.product();
strawberry = strawberrygarder.product();
apple.grow();
strawberry.grow();
}
}
posted on 2005-07-30 20:54
sky 閱讀(133)
評論(0) 編輯 收藏