设计模式之Factory深入研究
今天我去市场,要决定是买水果等产品,还是选择种水果的产品。具体怎么操作自己选择。来到市场,我发现主要有一些水果:苹果(Apple),葡萄(Grape)和鸭梨(Pear)。到底买什么好呢?我一阵思量。俗话说:“饭后一只烟,赛过活神仙。饭后吃苹果,西施见我躲。”为了老婆的漂亮,我决定买苹果。
下面开始Factory模式研究,当然是用我上面举的例子来说明。
Simple Factory模式
专门定义一个类来负责创建其它类的实例,被创建的实例通常都具有共同的父类。
Factory Method模式
将对象的创建交由父类中定义的一个标准方法来完成,而不是其构造函数,究竟应该创建何种对象由具体的子类负责决定。
Abstract Factory模式
提供一个共同的接口来创建相互关联的多个对象。
一、Simple Factory模式:
1、 在这里,我们先定义水果(Fruit)接口:
public interface Fruit {
void plant(); //水果是被种植的
void enableEat(); //水果能吃
}
2、 苹果(Apple)是对水果(Fruit)接口的实现:
public class Apple implements Fruit{
public void plant(){
System.out.println("种苹果!");
}
public void enableEat(){
System.out.println("苹果好吃!");
}
}
3、 葡萄(Grape)是对水果(Fruit)接口的实现:
public class Grape implements Fruit{
public void plant(){
System.out.println("种葡萄!");
}
public void enableEat(){
System.out.println("葡萄好吃!");
}
}
4、 鸭梨(Pear)是对水果(Fruit)接口的实现:
public class Pear implements Fruit{
public void plant(){
System.out.println("种鸭梨!");
}
public void enableEat(){
System.out.println("鸭梨好吃!");
}
}
5、定义买水果(BuyFruit)这一过程类:
public class BuyFruit {
/**
简单工厂方法
*/
public static Fruit buyFruit(String which){
if (which.equalsIgnoreCase("apple")) { //如果是苹果,则返回苹果实例
return new Apple();
}
else if (which.equalsIgnoreCase("pear")){ //如果是鸭梨,则返回鸭梨实例
return new Strawberry();
}
else if (which.equalsIgnoreCase("grape")) { //如果是葡萄,则返回葡萄实例
return new Grape();
}
else{
return null;
}
}
}
6、 编写测试类:
public class FruitTest {
public static void main(String args[]){
BuyFruit buy = new BuyFruit(); //开始买水果这个过程
buy.buyFruit("apple").enableEat(); //调用苹果的enableEat()方法
}
}
7、 说明:
A:我要购买苹果,只需向工厂角色(BuyFruit)请求即可。而工厂角色在接到请求后,会自行判断创建和提供哪一个产品。
B:但是对于工厂角色(BuyFruit)来说,增加新的产品(比如说增加草莓)就是一个痛苦的过程。工厂角色必须知道每一种产品,如何创建它们,以及何时向客户端提供它们。换言之,接纳新的产品意味着修改这个工厂。
C:因此Simple Factory模式的开放性比较差。
有什么办法可以解决这个问题吗?那就需要Factory Method模式来为我们服务了。
二、Factory Method模式:
1、同样,我们先定义水果(Fruit)接口:
public interface Fruit {
void plant(); //水果是被种植的
void enableEat(); //水果能吃
}
2、苹果(Apple)是对水果(Fruit)接口的实现:
public class Apple implements Fruit{
public void plant(){
System.out.println("种苹果!");
}
public void enableEat(){
System.out.println("苹果好吃!");
本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/fasttalk/archive/2005/03/21/325402.aspx