對(duì)簡(jiǎn)單工廠(chǎng)的特殊情況進(jìn)行測(cè)試——工廠(chǎng)角色與具體產(chǎn)品角色合并
代碼如下:
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();
}
}
上面的代碼中通過(guò)工廠(chǎng)方法把子類(lèi)具體的實(shí)例化隱藏了起來(lái)。
下面是對(duì)一個(gè)普通的簡(jiǎn)單工廠(chǎng)模式的實(shí)現(xiàn):
代碼測(cè)試:
package sky;
//產(chǎn)品抽象類(lèi)
abstract class People{
public String name; //名字
public String occuptationl; //職業(yè)
abstract public String getMsg();
}
//學(xué)生類(lèi)——具體產(chǎn)品
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;
}
}
//教師類(lèi)——具體產(chǎn)品類(lèi)
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;
}
}
//工廠(chǎng)類(lèi)
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");
//從這個(gè)顯示轉(zhuǎn)換申明中我并沒(méi)有看到簡(jiǎn)單工廠(chǎng)的好處
factory.build("fly","teacher");
/*難道只有這樣才可以看到它的優(yōu)點(diǎn)嗎?——能夠避免客戶(hù)決定什么時(shí)候創(chuàng)建哪個(gè)實(shí)例*/
t.setGrade("three");
System.out.println(t.getMsg());
} catch (BadPeopleException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
問(wèn)題:接口和抽象類(lèi)的區(qū)別在哪里?
第13章 工廠(chǎng)方法模式 <java與模式> ---電子書(shū) page146
組成為:抽象工廠(chǎng)、具體工廠(chǎng)、抽象產(chǎn)品、具體產(chǎn)品
其中抽象工廠(chǎng)是為外部訪(fǎng)問(wèn)內(nèi)部的一個(gè)接口,它的好處是可以通過(guò)擴(kuò)張具體產(chǎn)品和具體工廠(chǎng)而不用改變客戶(hù)端的代碼.
一個(gè)簡(jiǎn)單的測(cè)試代碼如下:
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();
}
}