源码:
// 抽象产品类:肤色
abstract class SkinColor {
public abstract String getColor();
}
class WhiteSkinColor extends SkinColor {
@Override
public String getColor() {
return "White";
}
}
class DarkSkinColor extends SkinColor { // 简化处理,将黄皮肤和黑皮肤归为一类
@Override
public String getColor() {
return "Dark"; // 可以是"Yellow"或"Black",这里统一为"Dark"
}
}
// 抽象产品类:性别
abstract class Gender {
public abstract String getGender();
}
class Male extends Gender {
@Override
public String getGender() {
return "Male";
}
}
class Female extends Gender {
@Override
public String getGender() {
return "Female";
}
}
// 抽象工厂类
abstract class PersonFactory {
public abstract SkinColor createSkinColor();
public abstract Gender createGender();
}
// 具体工厂类:白皮肤工厂
class LightSkinFactory extends PersonFactory {
@Override
public SkinColor createSkinColor() {
return new WhiteSkinColor();
}
@Override
public Gender createGender(String genderType) {
if (genderType.equals("Male")) {
return new Male();
} else if (genderType.equals("Female")) {
return new Female();
}
return null; // 或者抛出异常
}
}
// 具体工厂类:暗皮肤工厂(包括黄皮肤和黑皮肤)
class DarkSkinFactory extends PersonFactory {
@Override
public SkinColor createSkinColor() {
return new DarkSkinColor(); // 根据需要可以返回YellowSkinColor或BlackSkinColor
}
@Override
public Gender createGender(String genderType) {
if (genderType.equals("Male")) {
return new Male();
} else if (genderType.equals("Female")) {
return new Female();
}
return null; // 或者抛出异常
}
}
// 客户端代码
public class Client {
private SkinColor skinColor;
private Gender gender;
public void setFactory(PersonFactory factory, String genderType) {
skinColor = factory.createSkinColor();
gender = factory.createGender(genderType);
}
public void showPersonInfo() {
System.out.println("Skin Color: " + skinColor.getColor());
System.out.println("Gender: " + gender.getGender());
}
public static void main(String[] args) {
Client client = new Client();
// 使用白皮肤工厂创建男性
client.setFactory(new LightSkinFactory(), "Male");
client.showPersonInfo();
// 使用暗皮肤工厂创建女性
client.setFactory(new DarkSkinFactory(), "Female");
client.showPersonInfo();
}
}