设计模式(二)----- 抽象工厂(AbstractFactory)----(JAVA版)
来源:互联网 发布:项目数据分析报告 编辑:程序博客网 时间:2024/05/01 09:53
适用性:
1.一个系统要独立于它的产品的创建,组合和表示时
2.一个系统要由多个产品系列中的一个来配置时
3.当你要强调一系列相关的产品对象的设计以便进行联合使用时
4.当你提供一个产品类库,而只想显示它们接口而不是实现时
它有以下的优点
1:封装性,每个产品的实现类不是高层模块要关心的,它所要关心 的是接口和抽象类,他不关心对象是如何创建出来,只有工厂类去关心,只要知道工厂类是谁,我们就能得到一个需要的对象。
2:产品家族的约束为非公开状态。而抽象工厂模式针对的是多个产品等级结构。当每个抽象产品都有多于一个的具体子类的时候,工厂角色怎么知道实例化哪一个子类呢?比如每个抽象产品角色都有两个具体产品。抽象工厂模式提供两个具体工厂角色,分别对应于这两个具体产品角色,每一个具体工厂角色只负责某一个产品角色的实例化。每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例。
参与者:
1.AbstractFactory
声明一个创建抽象产品对象的操作接口
2.ConcreteFactory
实现创建具体产品对象的操作
3.AbstractProduct
为一类产品对象声明一个接口
4.ConcreteProduct
定义一个将被相应的具体工厂创建的产品对象
实现AbstractProduct接口
类图:
一个简单的例子:
AbstractFactory
- public interface IAnimalFactory{
- ICat createCat();
- IDog createDog();
- }
ConcreteFactory
- public class BlackAnimalFactory implements IAnimalFactory{
- public ICat createCat(){
- return new BlackCat();
- }
- public IDog createDog(){
- return new BlackDog();
- }
- }
- public class WhiteAnimalFactory implements IAnimalFactory{
- public ICat createCat(){
- return new WhiteCat();
- }
- public IDog createDog(){
- return new WhiteDog();
- }
- }
AbstractProduct
- public interface ICat{
- void eat();
- }
- public interface IDog{
- void eat();
- }
ConcreteProduct
- public class BlackCat implements ICat{
- public void eat(){
- System.out.println("the black cat is eating");
- }
- }
- public class WhiteCat implements ICat{
- public void eat(){
- System.out.println("the white cat is eating");
- }
- }
- public class BlackDog implements IDog{
- public void eat(){
- System.out.println("the black dog is eating");
- }
- }
- public class WhiteDog implements IDog{
- public void eat(){
- System.out.println("the white dog is eating");
- }
- }
Test
- public class Test{
- public static void main(String[] args){
- IAnimalFactory blackAnimalFactory = new BlackAnimalFactory();
- ICat blackCat = blackAniamlFactory.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();
- }
result:
the black cat is eating
the black dog is eating
the white cat is eating
the white dog is eating
抽象工厂方法从纵向上看,几乎没有可扩展性,假如我们想增加一个老虎,也就是说产品家族由原来的2个变为3个,程序将会有很大的变动,抽象工厂中就需要增加一个方法。这严重违背了开闭原则。并且抽象类是不喜欢被修改的。
但是从横向上来看,却对扩展性有了很好的支持,如果我们增加一个产品如greenCat,greenDog,我们只需要在写一个GreenAnimalFactory类就可以了,这里又符合了开闭原则,有多少个产品等级就应该有多少个实现工厂类。每增加一个产品等级就相应的增加一个实现工厂类,这里的扩展性又很自然的体现出来了。
参考资料:
1.http://gengu.iteye.com/blog/1125260
2.http://www.cnblogs.com/devinzhang/archive/2011/12/19/2293160.html
- 设计模式(二)----- 抽象工厂(AbstractFactory)----(JAVA版)
- 设计模式(二)----- 抽象工厂(AbstractFactory)----(JAVA版)
- Java设计模式之二:抽象工厂AbstractFactory
- 设计模式--抽象工厂(AbstractFactory)
- 设计模式 - AbstractFactory抽象工厂
- 抽象工厂模式(AbstractFactory)-设计模式(二)
- 浅谈 java 设计模式--抽象工厂模式(AbstractFactory pattern)
- [设计模式]AbstractFactory抽象工厂模式
- 设计模式 -- 抽象工厂模式 AbstractFactory
- 设计模式之抽象工厂模式(AbstractFactory)
- C++设计模式-AbstractFactory抽象工厂模式
- C++设计模式-AbstractFactory抽象工厂模式
- 【设计模式】-抽象工厂模式-AbstractFactory
- C++设计模式-AbstractFactory抽象工厂模式
- 设计模式 — 抽象工厂模式 (AbstractFactory)
- 设计模式-抽象工厂模式-abstractfactory-python
- C++设计模式-AbstractFactory抽象工厂模式
- C#设计模式之抽象工厂(AbstractFactory)
- JavaScript btoa atob
- 【shader】边缘自定角度高光,描边,闪烁
- NGINX 用户权限
- 安卓内存泄露之context使用不当
- context使用不当导致安卓内存泄露
- 设计模式(二)----- 抽象工厂(AbstractFactory)----(JAVA版)
- HDU3078 Network
- SURF算法
- 正则表达式在性能测试中的应用(续)
- Cordys对浏览器支持信息(Support information on latest browsers)
- 第二章 身份验证——《跟我学Shiro》
- android图像绘制获取本地图片或拍照图片等图片资源
- CentOS 6.5下利用Rsyslog+LogAnalyzer+MySQL部署日志服务器
- 欢迎使用CSDN-markdown编辑器