博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式学习之旅-抽象工厂模式
阅读量:5025 次
发布时间:2019-06-12

本文共 3405 字,大约阅读时间需要 11 分钟。

一、抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

 在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

二、介绍

意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

主要解决:主要解决接口选择的问题。

何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品,通过产品组和产品级别即可定义某一具体产品。

如何解决:在一个产品族里面,定义多个产品。

关键代码:在一个工厂里聚合多个同类产品。

三、代码演示

1 public abstract class AbstractFactory {2 3     abstract Sex getSex(String sex);4 5     abstract Animal getAnimal(String animal);6 }
1 public class AnimalFactory extends AbstractFactory { 2     @Override 3     Sex getSex(String sex) { 4         return null; 5     } 6  7     @Override 8     public Animal getAnimal(String animalKey) { 9         if (animalKey == null) {10             return null;11         } else {12             if ("dog".equals(animalKey)) {13                 return new Dog();14             }15             if ("cat".equals(animalKey)) {16                 return new Cat();17             }18             if ("rabbit".equals(animalKey)) {19                 return new Rabbit();20             }21             return null;22         }23     }24 }
1 public class SexFactory extends AbstractFactory { 2  3     @Override 4     public Sex getSex(String sex) { 5         if (sex == null) { 6             return null; 7         } else { 8             if ("male".equals(sex)) { 9                 return new Male();10             }11             if ("female".equals(sex)) {12                 return new Female();13             }14         }15         return null;16     }17 18     @Override19     Animal getAnimal(String animal) {20         return null;21     }22 }
1 public class FactoryProducer { 2     public static AbstractFactory getFactory(String factory){ 3         if("sex".equals(factory)){ 4             return new SexFactory(); 5         } 6         if("animal".equals(factory)){ 7             return new AnimalFactory(); 8         } 9         return null;10     }11 }
1 public interface Animal {2     void eat();3 }
1 public class Cat implements Animal {2     @Override3     public void eat() {4         System.out.println("猫吃鱼");5     }6 }
1 public class Dog implements Animal {2     @Override3     public void eat() {4         System.out.println("狗吃骨头");5     }6 }
1 public class Rabbit implements Animal {2     @Override3     public void eat() {4         System.out.println("兔子吃胡萝卜");5     }6 }
1 public interface Sex {2     void getSex();3 }
1 public class Male implements Sex {2     @Override3     public void getSex() {4         System.out.println("It's male");5     }6 }
1 public class AbstractFactoryDemo { 2  3     public static void main(String[] args) { 4         //获取性别工厂 5         AbstractFactory sexFactory = FactoryProducer.getFactory("sex"); 6  7         //获取动物工厂 8         AbstractFactory animalFactory = FactoryProducer.getFactory("animal"); 9 10         //获取雄性11         Sex male = sexFactory.getSex("male");12         male.getSex();13 14         //获取雌性15         Sex female = sexFactory.getSex("female");16         female.getSex();17 18         //获取狗狗19         Animal dog = animalFactory.getAnimal("dog");20         dog.eat();21 22         //获取猫咪23         Animal cat = animalFactory.getAnimal("cat");24         cat.eat();25 26         //获取兔兔27         Animal rabbit = animalFactory.getAnimal("rabbit");28         rabbit.eat();29     }30 }

运行结果

It's maleIt's female狗吃骨头猫吃鱼兔子吃胡萝卜

 

转载于:https://www.cnblogs.com/mrdong/p/8508993.html

你可能感兴趣的文章
oracle连接的三个配置文件(转)
查看>>
Vim配置文件(Vimrc)
查看>>
RecyclerView 局部刷新(获取viewHolder 去刷新)
查看>>
PHP表单(get,post)提交方式
查看>>
使用vbs或者bat脚本修改IE浏览器安全级别和选项
查看>>
Silverlight入门
查看>>
Silverlight动态调用WEBSERVICE,WCF方法
查看>>
LeetCode 895. Maximum Frequency Stack
查看>>
模仿segmentfault 评论
查看>>
一个简单的日志函数C++
查看>>
Java 8 中如何优雅的处理集合
查看>>
IOS程序的启动过程
查看>>
连接Linux下 XAMPP集成环境中部署的禅道的数据库MariaDB
查看>>
Java操作Excel和Word
查看>>
Oracle 体系结构之ORACLE物理结构
查看>>
ORA-12538: TNS: no such protocol adapter
查看>>
盒子模型
查看>>
局域网协议
查看>>
[HNOI2012]永无乡 线段树合并
查看>>
Spring整合hibernate:3、使用XML进行声明式的事务管理
查看>>