工厂三姐妹
工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。
工厂模式可以分为三种:
简单工厂模式:Simple Factory
工厂方法模式:Factory Method
抽象工厂模式:Abstract Factory
一、 简单工厂模式
简单工厂模式,又称为静态工厂方法模式,目的就是:定义一个用于创建对象的接口。
具体组成:
工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。
抽象产品角色:一般是具体产品继承的父类,或者实现的接口。
具体产品角色:工厂类所创建的对象就是此角色的实例。
这样,客户端避免了直接创建产品对象的责任,而仅仅负责消费产品。
然而,在实际应用中,产品很可能是一个多层次的树状结构,此时,简单工厂模式中只有一个工厂类来对应这些产品,此时这个工厂类的职责复杂了,于是,有了工厂方法模式。
二、 工厂方法模式
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
工厂方法模式,就是去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承,这样,集中在工厂方法上的压力,就可以由工厂方法中不同的工厂子类来分担,而不是只集中在一个工厂类上。
具体组成:
抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关,是具体工厂角色必须实现的接口,或者继承的父类。
具体工厂角色:含有和具体业务逻辑有关的代码,由应用程序调用以创建,对应的具体产品的对象。
抽象产品角色:是具体产品继承的父类,或者是实现的接口。
具体产品角色:具体工厂角色所创建的对象,就是此角色的实例。
工厂方法模式,使用继承子抽象工厂角色的多个子类,来代替简单工厂模式中的工厂类,这样便分担了压力,而且更加灵活。
当有新的产品产生时,只要按照抽象产品角色,抽象工厂角色来合成,就可以被客户使用,而不必修改任何已有的代码,符合开放封闭的原则。
但是,当产品的种类非常多时,会出现大量的与之对应的工厂对象,此时,可以考虑使用简单工厂模式和工厂方法模式相结合的的方式,来减少工厂类,即对于产品树上类似的种类可以使用简单工厂模式来实现。
工厂方法模式仿佛已经很完美的对对象的创建进行了包装,使得客户程序中仅仅处理抽象产品角色提供的接口。
什么时候使用工厂方法模式:当客户程序不需要知道要使用对象的创建过程,或者是客户程序使用的对象存在变动的可能,或者根本就不知道使用哪一个具体的对象。
简单工厂模式和工厂方法模式,并没有真正的避免了代码的改动,当产品对象创建条件的改变,必然会引起工厂角色的修改,面对这种情况,使用反射机制与配置文件的巧妙结合可以突破这种限制。
三、 抽象工厂模式
抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
抽象工厂的用意:给客户端提供一个接口,可以创建多个产品族中产品对象,抽象工厂模式需要满足的条件:系统中有多个产品族,而系统一次只可能消费其中一族产品,同属于同一个产品族的产品才会使用。
具体组成:
抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关,是具体工厂角色必须实现的接口,或者继承的父类。
具体工厂角色:含有和具体业务逻辑有关的代码,由应用程序调用以创建,对应的具体产品的对象。
抽象产品角色:是具体产品继承的父类,或者是实现的接口。
具体产品角色:具体工厂角色所创建的对象,就是此角色的实例。
它的组成和工厂方法模式如出一辙。
抽象工厂模式和工厂方法模式的区别,就在于需要创建对象的复杂程度上,而且,抽象工厂模式是工厂模式三个里面,最为抽象,最具一般性的。