设计模式之创建型之抽象工厂模式(Abstract Factory Pattern)
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?抽象工厂模式
一、什么是产品族?
是指位于不同产品等级结构中,功能相关联的产品组成的家族。这句话真的是太深奥了,网上查了下,那么你能解释什么叫产品族,可是我怎么知道什么是产品等级结构呢?网上没找到解释的,我看了一些源代码,自己理解的:动物又包括狗,猫等,狗又包括白狗,黑狗,猫有包括白猫,黑猫,那么我们可以将白猫和白狗放在一起,这就组成了一个白色动物的产品族!
二、什么是抽象工厂模式?
抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式提供多个具体工厂角色,分别对应于这多个具体产品角色,每一个具体工厂角色只负责某一个产品角色的实例化。每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例。例如产白猫(属于白色动物工厂角色)的就只产白猫。
三、工厂方法与抽象工厂方法:
工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结构。例如,工厂方法产动物就只管产动物,而抽象的则再多了一个等级,会产生不同颜色的动物,这个要是用工厂方法则会产生许多平行的等级结构
四、适用性,为什么要用抽象工厂模式:
角色:
抽象产品角色:工厂方法模式所创建的对象的父类,或它们共同拥有的接口,本例中的,IDog,ICat。
具体产品角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例,本例中的BlackCat,BlackDog,White。。。等四个。
抽象工厂角色:工厂方法模式的核心,本例中的IAnimalFactory。
具体工厂角色:在客户端的调用下创建产品的实例,本例中的BlackAnimal,WhiteAnimal。
六、示例代码:
?
package AbstractFactoryPattern;public interface ICat {public void eat();//猫吃的方法}public interface IDog {public void eat();}public class WhiteCat implements ICat{public void eat() {System.out.println("WhiteCat eat");}}public class BlackCat implements ICat{public void eat() {System.out.println("BlackCat eat");}}public class BlackDog implements IDog{public void eat() {System.out.println("BlackDog eat");}}public class WhiteDog implements IDog{public void eat() {System.out.println("WhiteDog eat");}}public interface IAnimalFactory {public ICat createCat();public IDog createDog();}public class WhiteAnimal implements IAnimalFactory{public ICat createCat() {return new WhiteCat();}public IDog createDog() {return new WhiteDog();}}public class BlackAnimal implements IAnimalFactory{public ICat createCat() {return new BlackCat();}public IDog createDog() {return new BlackDog();}}public class Test {public static void main(String[] args) {IAnimalFactory biaf=new BlackAnimal();ICat bic=biaf.createCat();IDog bid=biaf.createDog();IAnimalFactory wiaf=new WhiteAnimal();ICat wic=wiaf.createCat();IDog wid=wiaf.createDog();bic.eat();bid.eat();wic.eat();wid.eat();}}白猫,黑猫都属于猫。白狗,黑狗都属于狗。而猫狗都属于动物,所以动物依赖于猫狗等。而白猫,白狗都是白色动物,所以白动物又依赖于白猫狗。当动物工厂生产的时候,直接成产所需要的白色或黑色的动物,而白色动物又可以直接产生白猫或白狗。
?
八、优缺点:
优点:
1、扩充了工厂方法模式,支持多个产品族的创建!
2、符合开闭原则是不用说的了。每次增加新的产品,只需添加新的产品族,具体产品类,添加相应的具体工厂类即可!
3、依赖倒置原则也不用说了,主要依赖我们的接口,不依赖具体的实现类!
缺点:
1、暴漏具体工厂(这个不大明白什么意思);
2、要和其他模式如单利模式一起使用效果才会比较好!
3、个人觉得,要写的类什么的太多了,容易记混,而且架构图不怎么好画,画出来了都看起来很复杂似得