目录
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。