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

目录

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类

代码如下。

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。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力不期待

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值