一、概述

1、分类

工厂方法模式、抽象工厂模式;

 

二、工厂方法模式

1、分类

工厂方法模式分为三种:

①普通工厂模式:

就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建;

②多个工厂方法模式:

是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象;

③静态工厂方法模式:

将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可;

 

2、普通工厂模式

简介:

建立一个工厂类,对实现了同一接口的一些类进行实例的创建;

代码示例:

公共接口Person:

package com.zibo.design_mode.factory;

public interface Person {
void eat();
void sleep();
}

学生类:

package com.zibo.design_mode.factory;

public class Student implements Person {
@Override
public void eat() {
System.out.println("学生吃饭了!");
}

@Override
public void sleep() {
System.out.println("学生睡觉了!");
}
}

老师类:

package com.zibo.design_mode.factory;

public class Teacher implements Person {
@Override
public void eat() {
System.out.println("老师吃饭了!");
}

@Override
public void sleep() {
System.out.println("老师睡觉了!");
}
}

工厂模式测试类:

package com.zibo.design_mode.factory;

public class FactoryPattern {
public static void main(String[] args) {
Person p1 = create("学生");
p1.eat();
p1.sleep();
Person p2 = create("老师");
p2.eat();
p2.sleep();
}
//工厂方法
public static Person create(String string){
if("学生".equals(string)){
return new Student();
}else if("老师".equals(string)){
return new Teacher();
}else {
throw new RuntimeException("请输入正确的参数!");
}
}
}

运行结果:

学生吃饭了!
学生睡觉了!
老师吃饭了!
老师睡觉了!

 

3、多个工厂方法模式

简介:

该模式是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象;

代码示例:

PersonFactory类:

package com.zibo.design_mode.factory;

public class PersonFactory {
public Person createStudent(){
return new Student();
}

public Person createTeacher(){
return new Teacher();
}
}

PersonFactoryTest测试类:

package com.zibo.design_mode.factory;

public class PersonFactoryTest {
public static void main(String[] args) {
PersonFactory factory = new PersonFactory();
Person p1 = factory.createStudent();
p1.eat();
p1.sleep();
Person p2 = factory.createTeacher();
p2.eat();
p2.sleep();
}
}

运行结果:

学生吃饭了!
学生睡觉了!
老师吃饭了!
老师睡觉了!

 

4、静态工厂方法模式

简介:

将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可;

代码示例:

PersonStaticFactory类:

package com.zibo.design_mode.factory;

public class PersonStaticFactory {
public static Person createStudent(){
return new Student();
}

public static Person createTeacher(){
return new Teacher();
}
}

PersonStaticFactoryTest测试类:

package com.zibo.design_mode.factory;

public class PersonStaticFactoryTest {
public static void main(String[] args) {
Person p1 = PersonStaticFactory.createStudent();
p1.eat();
p1.sleep();
Person p2 = PersonStaticFactory.createTeacher();
p2.eat();
p2.sleep();
}
}

运行结果:

学生吃饭了!
学生睡觉了!
老师吃饭了!
老师睡觉了!

 

三、抽象工厂模式

1、简介

工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要扩展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?
那么这就用到了抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码;

 

2、代码示例

总工厂接口Factory:

package com.zibo.design_mode.factory;

public interface Factory {
Person create();
}

学生工厂类:

package com.zibo.design_mode.factory;

public class StudentFactory implements Factory {
@Override
public Person create() {
return new Student();
}
}

老师工厂类:

package com.zibo.design_mode.factory;

public class TeacherFactory implements Factory {
@Override
public Person create() {
return new Teacher();
}
}

工厂测试类:

package com.zibo.design_mode.factory;

public class FactoryTest {
public static void main(String[] args) {
Factory f1 = new StudentFactory();
Person p1 = f1.create();
p1.eat();
p1.sleep();
Factory f2 = new TeacherFactory();
Person p2 = f2.create();
p2.eat();
p2.sleep();
}
}

运行结果:

学生吃饭了!
学生睡觉了!
老师吃饭了!
老师睡觉了!