工厂方法的正确实现

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
}

请注意,MaleFemale classes 共享相同的数据和语义来处理这些数据。我的意思是 nameagegender

所以,我将实现一个抽象 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"。否则你的工厂模式做得很好。