工厂模式

57 阅读2分钟

工厂模式(Factory Pattern)是在开发中使用比较多的一种设计模式,通过工厂模式可以实现对对象的一种比较好的创建。工厂模式一般分为简单工厂、工厂方法和抽象工厂。

1.简单工厂

简单工厂包含以下角色:

  • 抽象产品:说明产品的规范内容等。Person类,定义一个简单的sayHello()方法。
  • 具体产品:抽象产品的子类或者实现抽象产品接口。以下Tearher,Student类。
  • 具体工厂:提供生产产品的方法。PersonFactory类,createPersion()方法。
public interface Person {

    void sayHello();
}

public class Teacher implements Person {
    @Override
    public void sayHello() {
        System.out.print("teacher says hello");
    }
}
public class Student implements Person {
    @Override
    public void sayHello() {
        System.out.print("student says hello");
    }
}
public class PersonFactory {


    public static Person createPerson(Integer type) {
        if (1 == type) {
            return new Teacher();

        } else if (2 == type) {
            return new Student();
        }
        return null;
    }
}
@Test
public void test() {
    Person person = PersonFactory.createPerson(1);
    person.sayHello();
}

2.工厂方法

工厂方法模式在简单工厂的基础上把工厂对象也做了抽象,加入了抽象工厂。

工厂方法包含以下角色:

  • 抽象工厂:工厂的抽象类,定义生产产品的接口 PersonInterfaceFactory 类
  • 具体工厂:实现抽象工厂,具体生产产品的类 StudentFactory、TeacherFactory类
  • 抽象产品:产品抽象类
  • 具体产品:具体产品
public interface PersonInterfaceFactory {
    Person createPerson();
}
public class StudentFactory implements PersonInterfaceFactory {
    @Override
    public Person createPerson() {

        return new Student();
    }
}
public class TeacherFactory implements PersonInterfaceFactory {
    @Override
    public Person createPerson() {

        return new Teacher();
    }
}
public class PersonInterfaceFactorySupport {
    private static Map<Integer, PersonInterfaceFactory> factoryMap = new HashMap<Integer, PersonInterfaceFactory>();

    static {
        factoryMap.put(1, new StudentFactory());
        factoryMap.put(2, new TeacherFactory());
    }

    public static Person createPerson(Integer type) {
        return factoryMap.get(type).createPerson();
    }

}
@Test
public void test() {
    Person person = PersonInterfaceFactorySupport.createPerson(1);
    person.sayHello();
}

3.抽象工厂

包含以下角色:

  • 抽象工厂:声明创建产品的方法。 PersonAbstractFactory 抽象工厂类,声明了创建学生createStudent()和创建老师createTeacher()的接口。
  • 具体工厂:实现抽象工厂,完成具体产品创建。ClassOneFactory 类可以表示一班的工厂,它创建一年级的学生那个和老师,ClassTwoFactory 表示二班的工厂
  • 抽象产品:定义产品的抽象角色 PersonStudent 学生抽象类,PersonTeacher 老师抽象类
  • 具体产品:产品具体角色。StudentOneClass、StudentTwoClass、TeacherOneClass、TeacherTwoClass 分别表示一班的学生老师和二班的学生老师。
public interface PersonAbstractFactory {

    PersonStudent createStudent();

    PersonTeacher createTeacher();
}
public class ClassOneFactory implements PersonAbstractFactory {
    @Override
    public PersonStudent createStudent() {
        return new StudentOneClass();
    }

    @Override
    public PersonTeacher createTeacher() {
        return new TeacherOneClass();
    }
}
public class ClassTwoFactory implements PersonAbstractFactory {
    @Override
    public PersonStudent createStudent() {
        return new StudentOneClass();
    }

    @Override
    public PersonTeacher createTeacher() {
        return new TeacherOneClass();
    }
}
public abstract class PersonStudent {

    public abstract void sayStudentHello();
}
public abstract class PersonTeacher {

    public abstract void sayTeacherHello();
}

public class StudentOneClass extends PersonStudent {
    @Override
    public void sayStudentHello() {
        System.out.print("student says hello");
    }
}

public class StudentTwoClass extends PersonStudent {
    @Override
    public void sayStudentHello() {
        System.out.print("student says hello");
    }
}
public class TeacherOneClass extends PersonTeacher {
    @Override
    public void sayTeacherHello() {
        System.out.print("teacher says hello");
    }
}
public class TeacherTwoClass extends PersonTeacher {
    @Override
    public void sayTeacherHello() {
        System.out.print("teacher says hello");
    }
}
@Test
public void test() {
    PersonAbstractFactory factory = new ClassOneFactory();
    PersonTeacher teacher = factory.createTeacher();
    PersonStudent student = factory.createStudent();
    teacher.sayTeacherHello();
    student.sayStudentHello();
}