设计模式之Factory深入研究

本文详细介绍了设计模式中的Factory模式,通过水果购买的场景,具体阐述了SimpleFactory、FactoryMethod和AbstractFactory模式的概念、实现及优缺点。重点展示了如何使用这些模式简化对象创建过程,以及在不同情况下选择合适的Factory模式带来的便利性和灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设计模式之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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值