设计模式之Factory深入研究
设计模式之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("苹果好吃!");
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fasttalk/archive/2005/03/21/325402.aspx