抽象工厂模式
一、什么是产品族?
是指位于不同产品等级结构中,功能相关联的产品组成的家族。这句话真的是太深奥了,网上查了下,那么你能解释什么叫产品族,可是我怎么知道什么是产品等级结构呢?网上没找到解释的,我看了一些源代码,自己理解的:动物又包括狗,猫等,狗又包括白狗,黑狗,猫有包括白猫,黑猫,那么我们可以将白猫和白狗放在一起,这就组成了一个白色动物的产品族!
二、什么是抽象工厂模式?
抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式提供多个具体工厂角色,分别对应于这多个具体产品角色,每一个具体工厂角色只负责某一个产品角色的实例化。每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例。例如产白猫(属于白色动物工厂角色)的就只产白猫。
三、工厂方法与抽象工厂方法:
工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结构。例如,工厂方法产动物就只管产动物,而抽象的则再多了一个等级,会产生不同颜色的动物,这个要是用工厂方法则会产生许多平行的等级结构
四、适用性,为什么要用抽象工厂模式:
1、当一个类不知道它所必须创建的对象的类的时候,
2、当一个类希望由它的子类来指定它所创建的对象的时候
那么知道1,2的时候,我们就应当选择工厂创建模型了
3、一个系统要由多个产品系列中的一个来配置时
4、处理具有相同(或者相似)等级结构的多个产品族中的产品对象的创建问题
五、示例角色和结构:
角色:
抽象产品角色:工厂方法模式所创建的对象的父类,或它们共同拥有的接口,本例中的,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、个人觉得,要写的类什么的太多了,容易记混,而且架构图不怎么好画,画出来了都看起来很复杂似得