工厂方法模式解耦了生产水果的功能职责
当水果店越开越大时,可能会产生额外的需求,例如需要对水果进行精致包装来吸引更多的客户,然而不同的水果其包装材料也不同,可能是纸箱、竹篮、塑料袋等,那么不同包装也需要不同的工厂来生产。
那么现在,我们就有了水果工厂来生产水果,包装工厂来包装水果(都是工厂方法模式实现)
![](https://img.haomeiwen.com/i11851909/dbf4a0273ad576a3.png)
具体调用:
public class AppleFactory implements FruitFactory{
public Fruit getFruit(){
return new Apple();
}
}
public class AppleBagFactory implements BagFactory{
public Bag getBag(){
return new AppleBag();
}
}
//...
public static void pack(){
//初始化苹果工厂
fruitFactory = new AppleFactory();//猎取工厂不对应
Fruit fruit = fruitFactory.getFruit();
fruit.draw();
//初始化苹果包装工厂
bagFactory = new AppleBagFactory();
Bag bag = bagFactory.getBag();
bag.pack();
//....邮寄业务
}
这就有一个问题,因为获取水果工厂和包装工厂都是人为操作,万一水果工厂和包装工厂拿错了怎么办?例如要包装苹果,拿到了苹果工厂,但是由于人员疏忽,包装工厂拿成了香蕉包装工厂,那么结果就是用香蕉的包装,把苹果包了起来,这是异常现象!
public static void pack(){
//初始化苹果工厂
fruitFactory = new AppleFactory();//猎取工厂不对应
Fruit fruit = fruitFactory.getFruit();
fruit.draw();
//初始化苹果包装工厂
bagFactory = new BananaBagFactory();//由于疏忽,拿成了香蕉包装工厂
Bag bag = bagFactory.getBag();
bag.pack();
//....邮寄业务
}
那么有没有什么办法可以避免这种情况,让同一种类的产品不要错乱呢
抽象工厂模式
让水果的生产方法和包装的生产方法绑定在一起,其实就是把两种工厂方法抽象到一个接口里面
![](https://img.haomeiwen.com/i11851909/28030536a8a159b3.png)
同一种类的水果工厂,负责该水果所有功能(水果的生产、水果的包装)
![](https://img.haomeiwen.com/i11851909/82ef802f5dac8f9b.png)
这就是抽象工厂模式的运用
总结
抽象工厂模式是对同一种类的业务进行了封装,避免使用错误
网友评论