工厂模式(一)

来源:互联网 发布:tensorflow运行界面 编辑:程序博客网 时间:2024/04/18 13:05

最近在看设计模式的资料,这里也就聊聊对工厂模式的理解好了。

(一)略讲设计模式

设计模式,其实就是一种方法,不局限于语言甚至程序。例如,经典的单例模式,在Java程序中会用到,在日常生活中,其实,也是有的。合理使用设计模式可以为我们解决很多事情:1)首先,从程序的层面来说,可以用来完善代码的设计结构,使得代码更加清晰,可读性好,从而减少维护的成本;亦可用来避免资源耗损,实现“高内聚,低耦合”2)从设计角度来说,通过设计或者复用成熟的解决方案,抛弃实现细节,可以更有效的分析问题的本质。

设计模式的一般原则:

OCP(开闭原则,Open-Closed Principle):“Software entities should be open for extension,but closed for modification。件实体应当对扩展开放,是指对于组件功能的扩展是开放的,是允许对其进行功能扩展的;对修改关闭,是指对于原有代码的修改是封闭的,即不应该修改原有的代码。
DIP(依赖倒转原则,Dependence Inversion Principle):要针对接口编程,不要针对实现编程。我的理解是,对于不同层次的编程,高层次暴露给低层次的应当只是接口,而不是它的具体类。
LoD(迪米特法则,Law of Demeter):只与你直接的朋友通信,而避免和陌生人通信。众所周知类(或模块)之间的通信越少,耦合度就越低,从而更有利于我们对软件的宏观管理

(二)工厂模式

工厂模式是一种非常常用的模式,因为它可以帮助生成实例对象,可以给系统带来更大的可扩展性和尽量少的修改量

例如,我们有一个Human类,它有很多子类,例如Baby,Girl,Boy等等,每个类都有特定的dress(),而这个dress方法的第一步就是要去得到一件衣服:

class Female extends Human{

    public void  dress(){

        Clothes clothes = new Skirt();

        ......

    }

}

我们可以看到,这个Skirt的初始方法很简单,但是在初始方法很复杂的情况下呢,而通常情况下,一些实例化工作需要很多工作,例如赋值,查询数据库,例如你要先去数据库去查查现在这个Female的衣柜里面有没有Skirt,有什么Skirt等等。而这一切可能需要很多的代码,而dress()方法应该注重的是dress本身的工作。另外,将这么长的初始化过程放在dress()方法里面也有悖于面向对象的思想,封装和分派告诉我们,应该讲长代码分割成多个段,每个段对应尽量单一的作用,以保证低耦合的需求。

因此,工厂模式可以应用于这个场景中了

工厂模式通常分为三种:

1)简单工厂模式

2)工厂方法模式

3)抽象工厂模式

我们将在下面进行具体的介绍

(三)简单工厂模式

简单工厂模式,Simple Factory,由三种角色组成:工厂类,抽象产品角色,具体产品角色。

他们的关系可以由图1表示:

外界使用Factory来获取Product对象。

我们使用dress()来具这个例子:

首先创建一个Factory类:

class ClothesFactory{

       public static Clothes  getClothesInstance(String model){

            Clothes clothes = null;

            if(model.equals("Skirt")){

                    ......

                 clothes = new Skirt(...);

             }

            if(model.equals("Uniform")){

                    ......

 

                 clothes = new Uniform(...);

             }

            if(model.equals("JeansWear")){

                    ......

                 clothes = new JeansWear(...);

             }

             ......

             return clothes;

      }

}

这个工厂类方法提供一个静态方法,提供各种衣服的初始化动作。其类图如下:


简单工厂模式好处在于产品的等级不会反应到工厂类中,但是,如果要增加新产品就会引起工厂类的修改,例如要增加一种SwimSuit, 那么需要在ClothesFactory中增加:

        if(model.equals("SwitmSuit")){

                ......

         }

这显然不符合开闭原则。但对于不太复杂,而产品又不会做太多变化的场景,简单工厂模式仍然是适用的。

(四)工厂方法模式

工厂方法模式有四种角色:抽象工厂,具体工厂,抽象产品,具体产品

其关系图如下:

我们对上面的dress例子进行变化

abstract class ClothesFactory{

         getClotesInstance().....

}

 class SkirtFactory{

          public static Clothes getClothesInstance(){

                          ......

           }

}

 class UniformFactory{

          public static Clothes getClothesInstance(){

                          ......

           }

}

 class JeansWearFactory{

          public static Clothes getClothesInstance(){

                          ......

           }

}

各自的工厂类提供对不同产品的初始化过程,返回对应衣服的实例。其类图如下:

 

工厂方法模式符合开闭原则,当新增一个产品时,只需要新增加新的具体产品和具体工厂就可以了,不需要对原有的逻辑进行修改。

(五)抽象工厂模式

抽象工厂模式的角色和工厂方法模式类似,但它面向的是更复杂的情况,我们看见工厂方法模式中所有的具体产品都集成自一个抽象产品,这是一种比较简单的结构,而抽象工厂模式面向于复杂的产品足的情况,例如Clothes有很多分类,Clothes下面的产品又隶属于不同的产品族,我们用类图来表述其中一种情况:

 

 

 

原创粉丝点击