Java设计模式二:工厂模式

  工厂(Factory)模式:定义一个用于创建产品的接口,由子类决定生产什么产品

一、定义与特点

  工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

  在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

  • 工厂模式适用于以下场景
    1、客户只知道创建产品的工厂名,而不知道具体的产品名。
    2、创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。
    3、客户不关心创建产品的细节,只关心产品的品牌。

二、实现方式

(1)创建接口

  创建一个People的接口,定义一个skill的方法。

public interface People {

	void skill();
}

(2)实现接口

  创建类Teacher,并实现People接口

public class Teacher implements People {

	@Override
	public void skill() {
		System.out.println("I am a teacher.");
	}

}

  创建类Student,并实现People接口

public class Student implements People {

	@Override
	public void skill() {
		System.out.println("I am a student.");
	}

}

(3)创建工厂

  创建工厂类PeopleFactory,根据传入的参数不同,返回不同的实例

public class PeopleFactory {

	public People getPeople(String className) {
		if (className.equals(Student.class.getSimpleName())) {
			return new Student();
		} else if (className.equals(Teacher.class.getSimpleName())) {
			return new Teacher();
		}

		return null;

	}
}

(4)使用工厂

  测试工厂类的实现

public class Test {

	public static void main(String[] args) {
		PeopleFactory factory = new PeopleFactory();
		People p = factory.getPeople("Teacher");
		p.skill();
	}
}

  测试输出效果

I am a teacher.

三、相关内容

  • 优缺点
    1、一个调用者想创建一个对象,只要知道其名称就可以了。
    2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
    3、屏蔽产品的具体实现,调用者只关心产品的接口。
    4、每次增加一个产品时,都需要增加一个具体类和对象实现工厂,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。

  • 模式结构
    1、抽象工厂(Abstract Factory):创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品。
    2、具体工厂(ConcreteFactory):实现抽象工厂中的抽象方法,完成具体产品的创建。
    3、抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
    4、具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

  • 参考文章
    1、https://www.runoob.com/design-pattern/factory-pattern.html
    2、http://c.biancheng.net/view/1348.html


更新时间:2020-08-07 14:15:52

本文由 新逸Cary 创作,如果您觉得本文不错,请随意赞赏
采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
原文链接:https://blog.xinac.cn/archives/java-design-factory.html
最后更新:2020-08-07 14:15:52

评论

Your browser is out of date!

Update your browser to view this website correctly. Update my browser now

×