工厂方法的正确实现
Correct Implementation of a Factory Method
我想了解什么是工厂模式的理论,我在这里正确实施了吗?如果不是有什么问题如果正确我应该更改什么?
界面
public interface Person {
public void setName(String name);
public String getName();
public void setAge(String age);
public String getAge();
public void setGender(String gender);
public String getGender();
}
男性对象
public class Male implements Person
{
public String name;
public String age;
public String gender;
@Override
public void setName(String name) {
this.name = name;
}
@Override
public String getName() {
return null;
}
@Override
public void setAge(String age) {
this.age = age;
}
@Override
public String getAge() {
return null;
}
@Override
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String getGender() {
return null;
}
}
女性对象
public class Male implements Person
{
public String name;
public String age;
public String gender;
@Override
public void setName(String name) {
this.name = name;
}
@Override
public String getName() {
return null;
}
@Override
public void setAge(String age) {
this.age = age;
}
@Override
public String getAge() {
return null;
}
@Override
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String getGender() {
return null;
}
}
对象工厂
public class PersonFactory {
public Person getPerson(String type) {
if(type == "MALE") {
return new Male();
}
else {
return new Female();
}
}
public Person getMale() {
return new Male();
}
public Person getFemale() {
return new Female();
}
}
主要方法
public class main {
public static void main(String[] args) {
PersonFactory pf = new PersonFactory();
Person adam = pf.getPerson("MALE");
}
}
除了 PersonFactory
中的 String comparison
以及在您的工厂成员中正确实施 getters
之外,似乎是下降实施。
并且在您的 getPerson() 逻辑中可以修改为
if (type == "MALE") {
return getMale();
} else {
return getFemale();
}
看起来不错,但我会继续为您的 "String" 方法使用工厂方法。也就是说:
public Person getPerson(String type) {
if(type == "MALE") {
return getMale()
}
else {
return getFemale();
}
}
这样,如果您想在一个地方进行更改,例如,如果您决定在 getFemale()
或 getMale()
中做一些特别的事情,那么您只需更新方法。
我会采用另一种方法。首先,我会将性别设为枚举:
public enum Gender {
Male, Female
}
请注意,Male
和 Female
classes 共享相同的数据和语义来处理这些数据。我的意思是 name
、age
和 gender
。
所以,我将实现一个抽象 class 来处理这些数据。请注意,class 字段 should be private
, not public
.
public abstract class AbstractPerson implements Person {
private String name;
private String age; // maybe int ?
private Gender gender;
public AbstractPerson() {
}
@override
public void setName(String name) {
this.name = name;
}
@override
public String getName() {
return name;
}
@override
public void setAge(String age) {
this.age = age;
}
@override
public String getAge() {
return age;
}
@override
public Gender getGender() {
return this.gender;
}
@override
public void setGender(Gender gender) {
this.gender = gender;
}
}
最好隐藏这个实现。所以我们把它隐藏到工厂 class:
public class PersonFactory {
private static PersonFactory instance = new PersonFactory();
public static PersonFactory getInstance() {
return instance;
}
public Person getPerson(Gender gender) {
return new AbstractPerson(gender);
}
public Person getMale() {
return getPerson(Gender.Male);
}
public Person getFemale() {
return getPerson(Gender.Female);
}
private PersonFactory {
}
private static class AbstractPerson implements Person {
private String name;
private String age; // maybe int ??
private Gender gender;
public AbstractPerson(Gender gender) {
this.gender = gender;
}
@override
public void setName(String name) {
this.name = name;
}
@override
public String getName() {
return name;
}
@override
public void setAge(String age) {
this.age = age;
}
@override
public String getAge() {
return age;
}
@override
public void setGender(Gender gender) {
this.gender = gender;
}
@override
public Gender getGender() {
return this.gender;
}
}
}
并且,这个工厂的用例:
PersonFactory factory = PersonFactory.getInstance();
Person malePerson = factory.getMale();
Person femalePerson = factory.getFemale();
更新:2015 年 9 月 15 日
请注意,如果你有多种对象,要由工厂生产,那么建议使用像 getPerson(Gender gender)
我刚刚在上面的代码中添加的通用方法。
您应该使用 "MALE".equals(type) 而不是 type == "MALE"。否则你的工厂模式做得很好。
我想了解什么是工厂模式的理论,我在这里正确实施了吗?如果不是有什么问题如果正确我应该更改什么?
界面
public interface Person {
public void setName(String name);
public String getName();
public void setAge(String age);
public String getAge();
public void setGender(String gender);
public String getGender();
}
男性对象
public class Male implements Person
{
public String name;
public String age;
public String gender;
@Override
public void setName(String name) {
this.name = name;
}
@Override
public String getName() {
return null;
}
@Override
public void setAge(String age) {
this.age = age;
}
@Override
public String getAge() {
return null;
}
@Override
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String getGender() {
return null;
}
}
女性对象
public class Male implements Person
{
public String name;
public String age;
public String gender;
@Override
public void setName(String name) {
this.name = name;
}
@Override
public String getName() {
return null;
}
@Override
public void setAge(String age) {
this.age = age;
}
@Override
public String getAge() {
return null;
}
@Override
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String getGender() {
return null;
}
}
对象工厂
public class PersonFactory {
public Person getPerson(String type) {
if(type == "MALE") {
return new Male();
}
else {
return new Female();
}
}
public Person getMale() {
return new Male();
}
public Person getFemale() {
return new Female();
}
}
主要方法
public class main {
public static void main(String[] args) {
PersonFactory pf = new PersonFactory();
Person adam = pf.getPerson("MALE");
}
}
除了 PersonFactory
中的 String comparison
以及在您的工厂成员中正确实施 getters
之外,似乎是下降实施。
并且在您的 getPerson() 逻辑中可以修改为
if (type == "MALE") {
return getMale();
} else {
return getFemale();
}
看起来不错,但我会继续为您的 "String" 方法使用工厂方法。也就是说:
public Person getPerson(String type) {
if(type == "MALE") {
return getMale()
}
else {
return getFemale();
}
}
这样,如果您想在一个地方进行更改,例如,如果您决定在 getFemale()
或 getMale()
中做一些特别的事情,那么您只需更新方法。
我会采用另一种方法。首先,我会将性别设为枚举:
public enum Gender {
Male, Female
}
请注意,Male
和 Female
classes 共享相同的数据和语义来处理这些数据。我的意思是 name
、age
和 gender
。
所以,我将实现一个抽象 class 来处理这些数据。请注意,class 字段 should be private
, not public
.
public abstract class AbstractPerson implements Person {
private String name;
private String age; // maybe int ?
private Gender gender;
public AbstractPerson() {
}
@override
public void setName(String name) {
this.name = name;
}
@override
public String getName() {
return name;
}
@override
public void setAge(String age) {
this.age = age;
}
@override
public String getAge() {
return age;
}
@override
public Gender getGender() {
return this.gender;
}
@override
public void setGender(Gender gender) {
this.gender = gender;
}
}
最好隐藏这个实现。所以我们把它隐藏到工厂 class:
public class PersonFactory {
private static PersonFactory instance = new PersonFactory();
public static PersonFactory getInstance() {
return instance;
}
public Person getPerson(Gender gender) {
return new AbstractPerson(gender);
}
public Person getMale() {
return getPerson(Gender.Male);
}
public Person getFemale() {
return getPerson(Gender.Female);
}
private PersonFactory {
}
private static class AbstractPerson implements Person {
private String name;
private String age; // maybe int ??
private Gender gender;
public AbstractPerson(Gender gender) {
this.gender = gender;
}
@override
public void setName(String name) {
this.name = name;
}
@override
public String getName() {
return name;
}
@override
public void setAge(String age) {
this.age = age;
}
@override
public String getAge() {
return age;
}
@override
public void setGender(Gender gender) {
this.gender = gender;
}
@override
public Gender getGender() {
return this.gender;
}
}
}
并且,这个工厂的用例:
PersonFactory factory = PersonFactory.getInstance();
Person malePerson = factory.getMale();
Person femalePerson = factory.getFemale();
更新:2015 年 9 月 15 日
请注意,如果你有多种对象,要由工厂生产,那么建议使用像 getPerson(Gender gender)
我刚刚在上面的代码中添加的通用方法。
您应该使用 "MALE".equals(type) 而不是 type == "MALE"。否则你的工厂模式做得很好。