76. log(\ 77. } 78.
79. public void plant(){
80. log(\ 81. } 82.
83. public static void log(String msg){ 84. System.out.println(msg); 85. } 86. } 87.
88. //农场园丁类,由他决定创建哪种水果类的实例 89. public class FruitGardener{ 90. //静态工厂方法
91. public static Fruit factory(String which) throws BadFruitException{ 92. if(which.equalslgnoreCase(\ 93. return new Apple();
94. }else if(which.equalslgnoreCase(\ 95. return new Grape();
96. }else if(which.equalslgnoreCase(\ 97. return new Strawberry(); 98. }else{
99. throw new BadFruitException(\ 100. } 101. } 102. } 103.
104. //异常类
105. public class BadFruitException extends Exception{ 106. public BadFruitException(String msg){ 107. super(msg); 108. } 109. } 110.
111. //测试类
112. public class Test{
113. FruitGardener gardener =new FruitGardener(); 114. try{
115. gardener.factory(\ 116. gardener.factory(\
117. gardener.factory(\
118. gardener.factory(\抛出异常 119. }catch(BadFruitException e){
120. System.out.println(\ 121. } 122. } 123. 2、举例: //水果接口 public interface Fruit{ void grow(); //生长 void harvest(); //收获 void plant(); //种植 } //苹果类 public class Apple implements Fruit{ private int treeAge //树龄 public void grow(){ log(\ } public void harvest(){ log(\ } public void plant(){ log(\ } //辅助方法 public static void log(String msg){ System.out.println(msg); } public int getTreeAge(){ return treeAge; } public void setTreeAge(int treeAge){ this.treeAge = treeAge; } } //葡萄类 public class Grape implements Fruit{
private boolean seedless; public void grow(){ log(\ } public void harvest(){ log(\ } public void plant(){ log(\ } public static void log(String msg){ System.out.println(msg); } //有无籽方法 public boolean getSeedless(){ return seedless; } public void setSeedlees(boolean seedless){ this.seedless = seedless; } }
//草莓类
public class Strawberry implements Fruit{ public void grow(){ log(\ } public void harvest(){ log(\ } public void plant(){ log(\ } public static void log(String msg){ System.out.println(msg);
} } //农场园丁类,由他决定创建哪种水果类的实例 public class FruitGardener{ //静态工厂方法 public static Fruit factory(String which) throws BadFruitException{ if(which.equalslgnoreCase(\ return new Apple(); }else if(which.equalslgnoreCase(\ return new Grape(); }else if(which.equalslgnoreCase(\ return new Strawberry(); }else{ throw new BadFruitException(\ } } } //异常类 public class BadFruitException extends Exception{ public BadFruitException(String msg){ super(msg); } } //测试类 public class Test{ FruitGardener gardener =new FruitGardener(); try{ gardener.factory(\ gardener.factory(\ gardener.factory(\ gardener.factory(\//抛出异常 }catch(BadFruitException e){ System.out.println(\ } }
3、三个角色:
1、工厂类(Creator)角色:在客户端的直接调用下创建产品对象 2、抽象产品角色:可以用一个接口或者一个抽象类实现
3、具体产品角色:工厂方法模式所创建的任何对象都是这个角色的实例
4、如果工厂方法总是循环使用同一个产品对象,那么这个工厂对象可以使用一个属性来存储这个产品对象。
每一次客户端调用工厂方法时,工厂方法总是提供这同一个对象。
如果工厂方法永远循环使用固定数目的一些产品对象,而且这些产品对象的数目并不大的话,
可以使用一些私有属性存储对这些产品对象的引用。比如:一个永远只提供一个产品对象的工厂对象
可以使用一个静态变量存储对这个产品对象的引用。
如果工厂方法使用数目不确定,或者数目较大的一些产品对象的话,使用属性变量存储对这些产品对象的引用就不方便了,
这时候 就应当使用聚集对象存储对产品对象的引用。
5、其他模式;
1、单例模式:单例模式要求单例类的构造子是私有的,从而客户端不能直接将之实例化,而必须通过这个静态工厂方法将之实例化,
而且单例类自身是自己的工厂角色。单例类自己负责创建自身的实例
单例类使用一个静态属性存储自己的唯一的实例,工厂方法永远仅提供这一个实例
2、多例模式:它是对单例模式的推广,多例模式也禁止外界直接将之实例化,同时通过静态工厂方法想外界提供循环使用的自身的实例, 多例模式可以有多个实例
多例模式具有一个聚集属性,通过向这个聚集属性登记已经创建过的实例达到循环使用实例的目的,
它还拥有一个内部状态,每一个内部状态都只有一个实例存在
根据外界传入的参量,工厂方法可以查询自己的登记聚集,如果具有这个状态的实例已经存在,
就直接将这个实例提供给外界:反之,就首先创建一个新的满足要求的实例,将之登记到聚集中,然后再提供客户端。
3、备忘录模式:单例模式和多例模式使用一个属性或者聚集属性来登记所创建的产品对象,一边可以通过查询这个属性或者聚集属性
找到并共享已经创建了的产品对象,这就是备忘录模式的应用。
4、MVC模式:是更高层次上的架构模式。
包括:合成模式、策略模式、观察者模式、也有可能会包括装饰模式、调停者模式、迭代子模式以及工厂方法模式等。
****:如果系统需要有多个控制器参与这个过程的话,简单工厂模式就不适合了,应当考虑使用工厂方法模式。
6、简单工厂模式的优点己缺点
优点:模式的核心是工厂类,这个类有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例。