从设计模式看水平----工厂模式

工厂模式是什么?为什么需要工厂模式?工厂模式为我们的代码带来了什么”利益“?

工厂模式是Java中常用的设计模式之一,这种类型的设计模式属于创建型模式,它提供了一种创建对象的极佳方法。

那我们为什么要使用它呢?假设我们需要根据不同条件创建几个对象,然后每个对象中都要进行一系列很长的初始化工作。假如我们一开始是在代码中直接new这样一个对象,然后再构造函数中写入这一系列的初始化代码,会发这个构造函数会非常之难看。这样做虽然没有什么不妥,但是有悖于Java面向对象的原则,面向对象的封装和分派告诉我们,尽量将长的代码分派”切割“成每段,将每段再”封装“起来,减少段与段的耦合度,以后在修改的时候只需修改某段而不会发生牵一动百的事情。这样我们就需要创建一个Factory来生产对应的对象,而不再是用new的方式了。然后将要创建的对象抽象成一个产品接口,然后让其子类实现该接口。在需要使用到这些产品对象的代码中采用面向接口的方式去调用这些产品的相关方法。

综上,我们使用工厂模式,是因为它可以简化一些代码维护问题,使功能模块解耦。

 

工厂模式主要解决什么问题?

主要解决接口选择的问题。

什么时候使用?

明确需要在不同的条件下创建不同的实例的时候。

如何解决?

让其子类实现产品接口,利用Factory创建返回所需要的产品。

 

优点: 1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。

缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

 

例子:

假设我们需要生产多种食物,这里采用工厂模式。

首先,创建一个接口。

Food.java

1 public interface Food{
2     public void info();
3 }

然后,创建实现接口的实体类。

Bread.java

1 public class Bread implements Food{
2     @Override
3     public void info(){
4         System.out.println("This is the Bread!");
5     }
6 }

Noodles.java

1 public class Noodles implements Food{
2     @Override
3     public void info(){
4         System.out.println("This is the Noodles!");
5     }
6 }

接下来创建一个工厂,生成基于给定对应信息的实体类对象。

FoodFactory.java

 1 public class FoodFactory{
 2     public static Food creator(String foodType){
 3         if(null == foodType){
 4             return null;
 5         }
 6         
 7         if("Bread".equalsIgnoreCase(foodType)){
 8             return new Bread();
 9         }else if("Noodles".equalsIgnoreCase(foodType)){
10             return new Noodles();
11         }
12         
13         return null;
14     }
15 }

最后,利用该工厂生产对应的实体类对象。

FactoryPatternDemo.java

 1 public class FactoryPatternDemo{
 2 
 3     public static void main(String[] args){
 4     
 5         //获取Bread对象,并调用info方法
 6         Food bread = FoodFactory.creator("Bread");
 7         bread.info();
 8         
 9         //获取Noodles对象,并调用info方法
10         Food noodles = FoodFactory.creator("Noodles");
11         noodles.info();
12     }
13 }

简单工厂模式到此结束。

 

posted @ 2016-08-29 15:52  tinygod  阅读(215)  评论(0)    收藏  举报