首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java抽象工厂模式的使用方法

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

作者头像
黑马Amos
发布2023-03-21 13:54:45
5600
发布2023-03-21 13:54:45
举报
文章被收录于专栏:李家杂货铺zi李家杂货铺zi

目录

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。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-07-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 分层
  • 2. 根据分层逻辑实现Main类
  • 3. 实现FamilyFactory类和方法getFactory
    • 3.1 实现3个子工厂类
      • 3.1.1 实现maleFamilyFactory类
      • 3.1.2 实现femaleFamilyFactory类
      • 3.1.3 实现animalFamilyFactory类
  • 4. 实现Factory类和方法getId
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档