【Java设计模式】003-工厂模式
原创
©著作权归作者所有:来自51CTO博客作者訾博ZiBo的原创作品,请联系作者获取转载授权,否则将追究法律责任
一、概述
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();
}
}
运行结果: