随着生产力的不断提高,小地主不再只要是苹果就吃了。他把苹果分为了两种。于是apple类就是这样的
public abstract class Apple{
public abstract void beEaten();
}
苹果分为两类 大苹果
public class BigApple extends Apple{
public void beEaten("大苹果被吃了");
}
小苹果
public class SmallApple extends Apple{
public void beEaten("小苹果被吃了");
}
同理香蕉也一样
public abstract class Banana {
public abstract void beEaten();
}
public class BigBanana extends Banana{
public void beEaten("大香蕉被吃了");
}
public class SmallBanana extends Banana{
public void beEaten("小香蕉被吃了");
}
重点来了,总管家
public abstract class FruitFactory{
public abstract Apple creatApple();
public abstract Banana creatBanana();
}
大管家
public class BigFactory extends FruitFactory{
public Apple creatApple{return new BigApple();}
public Banana creatBanana{return new BigBanana();}
}
小管家
public class SmallFactory extends FruitFactory{
public Apple creatApple (){return new SmallApple();}
public Banana creatBanana (){return new SmallBanana();}
}
所以小地主就这样吃水果了
FruitFactory fruitFactory =new SmallFactory ();
Apple apple=fruitFactory .creatApple();
apple.beEaten();
抽象工厂的最大优点就是想换产品非常简单,只需要修改FruitFactory fruitFactory =new SmallFactory ();这里就好了,所以呀,小地主就想吃大的就换大的,想吃晓得就换小的;第二有点就是对于客户端来说,实例的创建和自己是分离的,只是操作了抽象的接口,产品的具体实现也被具体工厂分隔了,客户端不用关心。
这个世界上估计是没有完美的东西,所以抽象工厂自然也有缺点,假如,小地主又发现可一种叫做菠萝的神奇水果,那么除了本身的代码外,还有修改三个管家的代码!!,这样是让人非常不爽的,所以就有了改良的抽象工厂,
public class FruitFactory{
public static Apple creatApple(String className){
return (Apple) Class.forName(className).newInstance();
}
public static Banana creatBanana(String className){
return (Banana ) Class.forName(className).newInstance();
}
}
同时开除大小管家
最终小地主吃水果变成了
Apple apple=FruitFactory.creatApple(“com.heaboy.pattendesign.factory.SmallApple ”);
注意所有Apple唯一的对外区别就是Small or Big 而且这个是个字符串,所以完全可以使用配置文件来定义这个地方。所谓的改良的抽象工厂就实现完毕了。
无论是改良的抽象工厂还是抽象工厂,一个常见的使用场景就是数据库连接,mysql就是Small 他的哥哥Oracle就是Big。
抽象工厂和改良的抽象工厂在Spring中使用的非常多