Java设计模式二:工厂模式

2020-08-0714:27:19 评论 59
摘要

工厂(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

 

XINAC
  • 本文由 发表于 2020-08-0714:27:19
  • 转载请注明:https://www.xinac.net/8871.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: