Java抽象工厂模式的使用方法

2023-03-21 13:54:45 浏览数 (2)

目录

1. 分层

2. 根据分层逻辑实现Main类

3. 实现FamilyFactory类和方法getFactory

3.1 实现3个子工厂类

3.1.1 实现maleFamilyFactory类

3.1.2 实现femaleFamilyFactory类

3.1.3 实现animalFamilyFactory类

4. 实现Factory类和方法getId


假设有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类

代码如下。

代码语言:javascript复制
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的实现代码如下。

代码语言:javascript复制
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类的实现代码如下。

代码语言:javascript复制
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类代码如下:

代码语言:javascript复制
package lyn;
public class Dad extends Id{
	public void display() {
		System.out.println("I am Dad!");
	}
}

GrandPa类代码如下:

代码语言:javascript复制
package lyn;
public class GrandPa extends Id{
	public void display() {
		System.out.println("I am GrandPa!");
	}
}

 Son类代码如下:

代码语言:javascript复制
package lyn;
public class Son extends Id{
	public void display() {
		System.out.println("I am Son!");
	}
}

 上述3个类实现了各自的display方法,因此Id类可以定义1个display的抽象方法,以使继任者实现各自的display方法,Id类代码如下。

代码语言:javascript复制
package lyn;
public abstract class Id{
	public abstract void display();
}

3.1.2 实现femaleFamilyFactory类

femaleFamilyFactory类的实现代码如下。

代码语言:javascript复制
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类代码如下:

代码语言:javascript复制
package lyn;
public class Mom extends Id{
	public void display() {
		System.out.println("I am Mom!");
	}
}

GrandMa类代码如下:

代码语言:javascript复制
package lyn;
public class GrandMa extends Id{
	public void display() {
		System.out.println("I am GrandMa!");
	}
}

Daughter类代码如下:

代码语言:javascript复制
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类的实现代码如下。

代码语言:javascript复制
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类代码如下:

代码语言:javascript复制
package lyn;
public class Dog extends Id{
	public void display() {
		System.out.println("I am Dog!");
	}
}

Cat类代码如下:

代码语言:javascript复制
package lyn;
public class Cat extends Id{
	public void display() {
		System.out.println("I am Cat!");
	}
}

4. 实现Factory类和方法getId

Factory类和方法getId的实现代码如下。

代码语言:javascript复制
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。

0 人点赞