23种设计模式之--简单工厂模式

周末本来想把touch事件的传递完善,但是无奈代码丢在公司了。这里顺便吐槽句公司实在离得远,平时不上班没有班车根本没法去公司,晚上加班也不能太晚不然没班车。。。如果离得稍近我应该就会天天泡到公司了。我ecplise坏了,所以现在只能手敲代码了。虽然没代码无法更新touch事件,可是还是要看点东西的,所以就简单研究了下设计模式中比较简单的一种,简单工厂模式。

何为设计模式呢?按照我比较浅显的理解就是帮助程序员在开发的过程中少走弯路,

更便捷的进行开发

那么没有设计模式能不能进行开发呢?

答案当然是肯定的,

但是如果不按照设计模式开发出来的代码一定是非常的不robust,

并且后期的扩展也是非常费劲

所以了解设计模式,并把它尽可能的运用到项目开发中是非常必要的。

那么关于设计模式的学习我觉得应该从以下三点出发:

1.该设计模式的特点是什么?

2.如何运用这种设计模式

3.在什么情况下运用,相比不用有什么好处?


我们就按照以上3点来研究下简单工厂模式:

1.简单工厂模式的特点是什么?这个是有定义的

简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式。

通过专门定义一个类来负责创建其他类的实例,

被创建的实例通常都具有共同的父类

根据定义我们可以得到它的特点如下:

1)有一个类,这个类有一个静态方法,这个方法时专门生成其他类的实例的。

我们把这个类称为factory.

2)被生成的其他类在逻辑上应该属于同一种类别,因此他们会有一个相同的父类。

3)这个父类是抽象的,但是对外提供了共性的方法接口,它的子类各自实现它就可以了。

2.如何运用简单工厂模式?

下面我们来模拟一个场景来上代码:

场景:一个人想要买苹果或者梨,但是她没有想好要买哪个水果,只是希望到时候要什么就买什么并且顺利的买到。

根据简单工厂模式特点来对号入座。

首先要有一个父类,这个父类是什么?明显就是苹果和梨的父类,那么也就是水果类,并且有一个抽象公共方法,产生水果的方法。

这个父类的代码如下:

Fruit.java

/**
接口,也就是一个抽象父类,是水果类,提供一个卖水果实例的抽象方法
*/
interface Fruit{
    public void sellFruit(); 

}
那么 这个父类会有两个水果子类,一个是苹果一个是梨,都要继承这个fruit类,代码如下

Apple.java

/**
水果类的子类之一,苹果类
*/
class Apple implements Fruit{
         public void sellFruit(){
          System.out.println("卖苹果");
      }
}

Pear.java

/**
水果类的子类之一,梨类
*/
class Pear implements Fruit{
     public void sellFruit(){
       System.out.println("卖梨");
}
}

以上还没有到工厂模式,只是多态性的设计,下一步就是工厂模式的一个重点了,有一个专门生产其他类的Factory类,

FruitFactory.java

/**
水果工厂类,作用就是有一个静态方法用来生产各种各样的水果
*/
class FruitFactory{
   /**
       生产水果的方法
        type:水果的类型
   */
    public static Fruit createFruit(String fruitType){
          Class fruit = Class.forName(fruitType);//这里是要抛类找不到异常的,但是我纯手写就不写了
          return (Fruit)fruit.newInstance();
    }
}

可以看出这个生产水果的方法时 完全运用了Class的方法来 生成对象的, 这样做的好处是不需要判断参数类型,直接根据参数来生成相应的水果. 如果运用判断传递过来的参数是苹果还是梨来生成不同水果的方法的弊端就是,如果 又多了其他的水果在程序写好后,那么我们还要改这个factory类, 这是非常不必要的与糟糕的。


现在我们这些基本的类都完成了,那就在我们的主类中进行工厂模式的实现:

MainFactory.java

public class MainFactory{
   public static void main(String[] args){
        //根据工厂类造一个苹果实例
        Fruit apple = FruitFactory.createFruit("Apple");
      //根据工厂类造一个梨的实例
      Fruit pear = FruitFactory.createFruit("Pear");
       //调用这两个fruit的sell方法
      apple.sellFruit();
      pear.sellFruit();
  }
}
运行后我们可以看到分别走了不同子类的sell方法。

以上为简单工厂模式的一个运用。


那么使用简单工厂模式和不使用简单工厂模式的区别在哪?

   1.如果不使用简单工厂模式,那我们怎么创造苹果实例,梨的实例?

      Apple apple = Apple中创苹果实例的方法

     Pear pear = Pear中创造梨实例的方法。

首先我们要研究苹果创造实例的方法和梨创造梨的方法这样要牵扯到苹果类和梨类。

其次如果多一个水果又要去研究多出来的类的创造实例方法。。。这样无止境研究不符合java中弱耦合特性。

而工厂模式只需要研究一个工厂中是如何创造出实例方法即可,即使再加不同的实例在后期,我们也不需要看新加的类,还是继续调用工厂类方法。


 2、不符合生活逻辑与软件开发

     我们生活中在买水果时,不论买苹果还是梨,一定都是去市场买,而不是买苹果去苹果店,买梨去梨店,这样对消费者太辛苦。那么我们在软件开发时也是一样的

并且在实际开发中,项目都不是一个人完成的,一定是有分工的,如果不使用这种模式那么协同起来会有很大问题。


最后一个要研究的点是我们什么时候用到工厂模式。

这个在javaWeb开发中使用的比较多的,比如说要连接数据库,可以连接sqlServer,mySql,Oracle.那我们就需要创造这个数据库的实例。创造数据库实例的方法就需要放在工厂模式中去完成,而不是分别创造,这样封装性太差。



最后,这种简单工厂模式有没有缺点?

显而易见是有的,在调用时要传递参数

Fruit apple = FruitFactory.createFruit("Apple");

如果这个参数Apple写成apple都会报错,这样非常不灵活,但是如果要让这个灵活那么factory类就不好扩展了,因此这是一个两难。因此也就衍生出了更牛叉的工厂模式。

这个下次再说。


我现在代码量还不够,因此这些模式也就是懂个大概,希望一起学习吧。


你可能感兴趣的:(23种设计模式之--简单工厂模式)