设计模式——工厂设计模式
工厂设计模式属于设计模式中的创建型模式,是在Java中常用的设计模式之一。创建型模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
工厂模式一般指的是简单工厂模式(Simple Factory)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)。其中简单工厂模式不属于23种设计模式,因为其不符合开闭原则,每次增加新的产品就需要修改工厂类,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展维护。
一、简单工厂模式
简单工厂模式的核心是定义一个创建对象的工厂类,将对象的创建交由工厂类来执行,降低系统的耦合度,使得修改起来相对容易些,当以后实现改变时,只需要修改工厂类即可。
UML类图:
// 产品类
abstract class Television{
public Television(){}
}
public class Television01 extends Television{
public Television01(){
System.out.println("Television01");
}
}
public class Television02 extends Television{
public Television02(){
System.out.println("Television02");
}
}
// 工厂类
public classs Factory{
public Television createTelevision(int type) {
switch (type) {
case 1:
return new Television01();
case 2:
return new Television02();
default:
break;
}
return null;
}
}
// 测试
public class Customer {
public static void main(String[] args) {
Factory factory = new Factory();
Television tv1 = factory.createTelevision(1);
Television tv2 = factory.createTelevision(2);
}
}
二、工厂方法模式
工厂方法模式相对于简单工厂模式,将工厂类抽象了出来,与简单工厂模式相同,还是将创建对象的任务交由工厂类,不过是由具体的工厂类来决定创建什么对象,当需要增加新产品时,只需要增加对应的产品类和工厂实现类即可。这样就符合了开闭原则,扩展时不必去修改原来的代码。
UML类图:
// 产品类
abstract class Television{
public Television(){}
}
public class Television01 extends Television{
public Television01(){
System.out.println("Television01");
}
}
public class Television02 extends Television{
public Television02(){
System.out.println("Television02");
}
}
// 工厂类
interface class FactoryTelevision{
Television createTelevision();
}
public class FactoryTelevision01 implements FactoryTelevision{
@Override
public Television01 createTelevision() {
return new Television01();
}
}
public class FactoryTelevision02 implements FactoryTelevision{
@Override
public Television02 createTelevision() {
return new Television02();
}
}
// 测试
public class Customer {
public static void main(String[] args) {
FactoryTelevision01 factoryTV1 = new FactoryTelevision01();
Television01 television01 = factoryTV1.createTelevision();
FactoryTelevision02 factoryTV2 = new FactoryTelevision02();
Television02 television02 = factoryTV2.createTelevision();
}
}
三、抽象工厂模式
在工厂方法模式中,我们使用一个工厂创建一个对象,一个具体工厂对应一个具体对象,但有时候我们需要一个工厂能够提供多个对象,而不是单一的对象,这个时候我们就需要使用抽象工厂模式。
例如:一个品牌工厂不止有一款产品,这个工厂可能生产冰箱、空调、热水器等等,工厂设计模式已经不能够满足我们的需求了,因为工厂设计模式只能产出单一的产品,这个时候就需要使用抽象工厂模式。
UML类图:
// 产品类
public class Television{
}
public class Television01{
public Television01(){
System.out.println("Television01");
}
}
public class Television02{
public Television02(){
System.out.println("Television02");
}
}
public class DVD{
}
public class DVD01{
public DVD01(){
System.out.println("DVD01");
}
}
public class DVD02{
public DVD02(){
System.out.println("DVD02");
}
}
// 工厂类
interface class AbstractFactory{
public Television createTelevision();
public DVD createDVD();
}
public class Factory01 implements AbstractFactory{
@Override
public Television createTelevision() {
return new Television01();
}
@Override
public DVD createDVD() {
return new DVD01();
}
}
public class Factory02 implements AbstractFactory{
@Override
public Television createTelevision() {
return new Television02();
}
@Override
public DVD createDVD() {
return new DVD02();
}
}
// 测试
public class Customer {
public static void main(String[] args){
//生产工厂1系列产品
Factory01 factory01 = new Factory01();
factory01.createTelevision();
factory01.createDVD();
//生产工厂2系列产品
Factory02 factory02 = new Factory02();
factory02.createTelevision();
factory02.createDVD();
}
}