当一个系统或者系统的某部分需要独立创建,组合使用的情况下。或者更深的通过配置文件配置 时,抽象工厂帮助我们完成以上需求。
有时,我们写一套属于自己提供的API,我们只需要提供自己的接口给用户,该设计模式同样适用。
使用该模式的产品具有一定的关联性。通常表现拥有同样的行为(方法);
1.使用该模式必须先有抽象产品的接口,如下:
package com.vr.pro;
public interface ICat {
void eat();
}
//实现
package com.vr.pro.impl;
import com.vr.pro.ICat;
public class WhiteCat implements ICat {
@Override
public void eat() {
System.out.println("the white cat is eating!");
}
}
//实现
package com.vr.pro.impl;
import com.vr.pro.ICat;
public class BlackCat implements ICat {
@Override
public void eat() {
System.out.println("the black cat is eating!");
}
}
(IDog同理)
2.然后创建一个抽象工厂。它返回的只是产品的接口对象,如下:
package com.vr.fact;
import com.vr.pro.ICat;
import com.vr.pro.IDog;
public interface IAnimalFactory {
ICat createCat();
IDog createDog();
}
3.对于实现了该工厂的类。只需要实现返回具体的产品对象。如下:
package com.vr.fact.impl;
import com.vr.fact.IAnimalFactory;
import com.vr.pro.ICat;
import com.vr.pro.IDog;
import com.vr.pro.impl.BlackCat;
import com.vr.pro.impl.BlackDog;
public class BlackAnimalFactory implements IAnimalFactory {
@Override
public ICat createCat() {
return new BlackCat();
}
@Override
public IDog createDog() {
return new BlackDog();
}
}
package com.vr.fact.impl;
import com.vr.fact.IAnimalFactory;
import com.vr.pro.ICat;
import com.vr.pro.IDog;
import com.vr.pro.impl.WhiteCat;
import com.vr.pro.impl.WhiteDog;
public class WhiteAnimalFactory implements IAnimalFactory {
@Override
public ICat createCat() {
return new WhiteCat();
}
@Override
public IDog createDog() {
return new WhiteDog();
}
}
4.至此,抽象工厂设计完成。对于第三方客户端,只需要调用抽象工厂子类创建产品对象即可
IAnimalFactory whiteAnimalFactory=new WhiteAnimalFactory();
IAnimalFactory blackAnimalFactory=new BlackAnimalFactory();
ICat whiteCat=whiteAnimalFactory.createCat();
IDog whiteDog=whiteAnimalFactory.createDog();
ICat blackcatCat=blackAnimalFactory.createCat();
IDog blackDog=blackAnimalFactory.createDog();
whiteCat.eat();
whiteDog.eat();
blackcatCat.eat();
blackDog.eat();