设计模式-抽象工厂

随着生产力的不断提高,小地主不再只要是苹果就吃了。他把苹果分为了两种。于是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中使用的非常多

在Spring-bean中的位置
举例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值