Java抽象工厂模式的使用方法
目录
3. 实现FamilyFactory类和方法getFactory
假设有1个家庭,家庭成员为爷爷、爸爸、儿子、奶奶,妈妈、女儿、狗和猫。
爷爷、爸爸、儿子为男性,奶奶,妈妈、女儿为女性,狗和猫为动物。
如果将此家庭看成一个工厂(用FamilyFactory类表示),那么爷爷、爸爸、儿子分在男性子工厂(用maleFamilyFactory类表示),奶奶,妈妈、女儿分在女性子工厂(用femaleFamilyFactory类表示),狗和猫分在动物子工厂(用animalFamilyFactory表示)那么分层后就是下面这样。
1. 分层
1)Top层就是家庭工厂,FamilyFactory类;
2)第2层(L2)就是子工厂,maleFamilyFactory类、femaleFamilyFactory类和animalFamilyFactory类(这3个类统一用1个抽象类描述,这也是抽象工厂模式的思想,本例设为Factory类)。
3)第3层(L3)就是maleFamilyFactory类对应的GrandPa类、Dad类和Son类;以及femaleFamilyFactory类对应的GrandMa类、Mom类和Daughter类;以及animalFamilyFactory类对应的Dog类和Cat类。
假如现在我们需要输出每个对象的个人身份,流程是下面这样。
2. 根据分层逻辑实现Main类
代码如下。
package lyn;
public class Main{
public static void main(String[] args) {
Factory malefactory = FamilyFactory.getFactory("male");
Id IdMale = malefactory.getId("Dad");
IdMale.display();
Factory animalfactory = FamilyFactory.getFactory("Animal");
Id IdAnimal = animalfactory.getId("Dog");
IdAnimal.display();
Factory femalefactory = FamilyFactory.getFactory("female");
Id IdFemale = femalefactory.getId("Mom");
IdFemale.display();
}
}
上述代码要求我们实现FamilyFactory类和方法getFactory,以及Factory类和方法getId,以及Id类和方法display。
3. 实现FamilyFactory类和方法getFactory
该方法接收字符串male、animal和female,并返回1个Factory类型的对象。
FamilyFactory类和方法getFactory的实现代码如下。
package lyn;
public class FamilyFactory{
public static Factory getFactory(String choice) {
if(choice.equalsIgnoreCase("male")){
return new maleFamilyFactory();
}else if(choice.equalsIgnoreCase("female")) {
return new femaleFamilyFactory();
}else if (choice.equalsIgnoreCase("animal")){
return new animalFamilyFactory();
}
else
return null;
}
}
处理逻辑为:若接收到“male”,返回一个maleFamilyFactory对象;若接收到“female”,返回一个femaleFamilyFactory对象;若接收到“animal”,返回一个animalFamilyFactory对象,既然返回类型为Factory,所以maleFamilyFactory类、femaleFamilyFactory类和animalFamilyFactory类都必须继承自Factory类,以下为实现3个子工厂类的方法。
3.1 实现3个子工厂类
3.1.1 实现maleFamilyFactory类
maleFamilyFactory类的实现代码如下。
package lyn;
class maleFamilyFactory extends Factory{
public Id getId(String string) {
if(string.equalsIgnoreCase("Dad")) {
return new Dad();
}else if(string.equalsIgnoreCase("GrandPa")) {
return new GrandPa();
}
else if(string.equalsIgnoreCase("Son")) {
return new Son();
}else {
return null;
}
}
}
上述代码中,maleFamilyFactory类继承自Factory类,而Dad类、GrandPa类和Son类都应继承自Id类,对应的代码如下。
Dad类代码如下:
package lyn;
public class Dad extends Id{
public void display() {
System.out.println("I am Dad!");
}
}
GrandPa类代码如下:
package lyn;
public class GrandPa extends Id{
public void display() {
System.out.println("I am GrandPa!");
}
}
Son类代码如下:
package lyn;
public class Son extends Id{
public void display() {
System.out.println("I am Son!");
}
}
上述3个类实现了各自的display方法,因此Id类可以定义1个display的抽象方法,以使继任者实现各自的display方法,Id类代码如下。
package lyn;
public abstract class Id{
public abstract void display();
}
3.1.2 实现femaleFamilyFactory类
femaleFamilyFactory类的实现代码如下。
package lyn;
public class femaleFamilyFactory extends Factory{
public Id getId(String string) {
if(string.equalsIgnoreCase("Mom")) {
return new Mom();
}else if(string.equalsIgnoreCase("GrandMa")) {
return new GrandMa();
}
else if(string.equalsIgnoreCase("Daughter")) {
return new Daughter();
}else {
return null;
}
}
}
上述代码中,femaleFamilyFactory类继承自Factory类,而Mom类、GrandMa类和Daughter类都应继承自Id类,对应的代码如下。
Mom类代码如下:
package lyn;
public class Mom extends Id{
public void display() {
System.out.println("I am Mom!");
}
}
GrandMa类代码如下:
package lyn;
public class GrandMa extends Id{
public void display() {
System.out.println("I am GrandMa!");
}
}
Daughter类代码如下:
package lyn;
public class Daughter extends Id{
public void display() {
System.out.println("I am Daughter!");
}
}
上述3个类实现了各自的display方法,因此Id类可以定义1个display的抽象方法,以使继任者实现各自的display方法。
3.1.3 实现animalFamilyFactory类
animalFamilyFactory类的实现代码如下。
package lyn;
public class animalFamilyFactory extends Factory{
public Id getId(String string) {
if(string.equalsIgnoreCase("Dog")) {
return new Dog();
}else if(string.equalsIgnoreCase("Cat")) {
return new Cat();
}else {
return null;
}
}
}
上述代码中,animalFamilyFactory类继承自Factory类,而Dog类和Cat类都应继承自Id类,对应的代码如下。
Dog类代码如下:
package lyn;
public class Dog extends Id{
public void display() {
System.out.println("I am Dog!");
}
}
Cat类代码如下:
package lyn;
public class Cat extends Id{
public void display() {
System.out.println("I am Cat!");
}
}
4. 实现Factory类和方法getId
Factory类和方法getId的实现代码如下。
package lyn;
public abstract class Factory{
public abstract Id getId(String string);
}
这里的getId定义为抽象方法的结果就是要求Factory类的继任者(即maleFamilyFactory类、femaleFamilyFactory类和animalFamilyFactory类)实现各自的getId方法,见3.1.1、3.1.2和3.1.3。
相关文章
- java解析xml方法_详解Java解析XML的四种方法
- java除法保留两位小数_JAVA除法保留小数点后两位的两种方法
- java判断一个对象是否为空_Java中判断对象是否为空的方法的详解
- java数组的声明_Java数组定义常用方法[通俗易懂]
- Java实现单例模式的9种方法
- java控制台输入数组_Java控制台输入数组并逆序输出的方法实例
- Java 关于重写compareTo方法
- java获取服务器路径_JAVA获取服务器路径的方法「建议收藏」
- java dom4j 添加节点_Java dom4j获取,添加,删除,查找,设置Element节点方法「建议收藏」
- java 随机数算法_Java随机数算法原理与实现方法实例详解
- java h2 数据库_Java H2数据库
- Java list foreach_java的foreach
- Java方法重载_java入门方法的使用
- Java学习笔记之六java三种循环(for,while,do……while)的使用方法及区别详解编程语言
- Java Connection.setAutoCommit()方法:设置数据库连接的提交模式
- 解决Linux下重启Java程序的方法(linux重启java)
- 面试前准备:Java技术和Redis快速入门(java面试redis)
- 时间解决Redis中Java设置过期时间的方法(redisjava过期)
- 掌握必备技能:Linux下Java命令的使用(java命令linux)
- Linux系统中下载Java的方法(linux下java下载)
- 进程Linux下创建多个Java进程的简易方法(linux 多个java)
- 版本Linux查看Java版本的简单方法(linux 查看java)
- java获取项目文件路径实现方法
- java基本教程之join方法详解java多线程教程
- Java策略模式的简单应用实现方法
- java中使用数组进行模拟加密的方法