抽象工厂模式的理解:用抽象工厂来定义具体工厂的抽象,而由具体工厂来创建对象
我们以创建一个动物打比喻:
用抽象动物工厂(IAnimalFactory)来定义具体动物工厂的抽象(ICat、IDog),而由具体的动物工厂(BlackCat、BlackDog、WhiteCat、WhiteDog)来创建动物,这就是抽象工厂与工厂方法的不同,工厂方法中对象的创建是由工厂方法来确定的,创建的对象都是不分类并且实现一个接口的,而抽象工厂就是在工厂方法的基础上对创建动物的对象的行为进行分类,比如黑色动物工厂,白色动物工厂等。
代码:
package AbstractFactory;
public interface IAnimalFactory {
ICat createCat();
IDog createDog();
}
package AbstractFactory;
public class BlackAnimalFactory implements IAnimalFactory {
public ICat createCat() {
// TODO Auto-generated method stub
return new BlackCat();
}
public IDog createDog() {
// TODO Auto-generated method stub
return new BlackDog();
}
}
package AbstractFactory;
public class BlackCat implements ICat {
public void eat() {
// TODO Auto-generated method stub
System.out.println("The black cat is eating!");
}
}
package AbstractFactory;
public class BlackDog implements IDog {
public void eat() {
// TODO Auto-generated method stub
System.out.println("The black dog is eating!");
}
}
package AbstractFactory;
public interface ICat {
void eat();
}
package AbstractFactory;
public interface IDog {
void eat();
}
package AbstractFactory;
public class WhiteAnimalFactory implements IAnimalFactory{
public ICat createCat() {
// TODO Auto-generated method stub
return new WhiteCat();
}
public IDog createDog() {
// TODO Auto-generated method stub
return new WhiteDog();
}
}
package AbstractFactory;
public class WhiteCat implements ICat {
public void eat() {
// TODO Auto-generated method stub
System.out.println("The white cat is eating!");
}
}
package AbstractFactory;
public class WhiteDog implements IDog {
public void eat() {
System.out.println("The white cat is eating!");
}
}
package AbstractFactory;
/**
* 抽象工厂模式
* 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
适用性
1.一个系统要独立于它的产品的创建、组合和表示时。
2.一个系统要由多个产品系列中的一个来配置时。
3.当你要强调一系列相关的产品对象的设计以便进行联合使用时。
4.当你提供一个产品类库,而只想显示它们的接口而不是实现时。
* @author Administrator
*
*/
public class Test {
public static void main(String args[]){
IAnimalFactory blackAnimalFactory = new BlackAnimalFactory();
ICat blackCat = blackAnimalFactory.createCat();
blackCat.eat();
IDog blackDog = blackAnimalFactory.createDog();
blackDog.eat();
//
IAnimalFactory whiteAnimalFactory = new WhiteAnimalFactory();
ICat whiteCat = whiteAnimalFactory.createCat();
whiteCat.eat();
IDog whiteDog = whiteAnimalFactory.createDog();
whiteDog.eat();
}
}