ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

【设计模式-04】Factory工厂模式

2026/9/16 5:43:23 拓冰建站 浏览量
【设计模式-04】Factory工厂模式

简要描述

  • 简单工厂
  • 静态工厂
  • 工厂方法 FactoryMethod
    • 产品维度扩展
  • 抽象工厂
    • 产品一族进行扩展
  • Spring IOC

一、工厂的定义

  • 任何可以产生对象的方法或类,都可以称之为工厂
  • 单例也是一种工厂
  • 不可咬文嚼字,死扣概念
  • 为什么有了new之后,还要有工厂?
    • 灵活控制生产过程
    • 权限、日志、修饰...

二、FactoryMethod 工厂方法

  • 任意定制交通工具
    • 继承Movable接口
  • 任意定制生产过程
    • Movable XXXFactory.create()
  • 任意定义产品一族

1、定义Movable接口

/*** @description: 可移动的交通工具接口* @author: flygo* @time: 2022/7/5 10:00*/
public interface Movable {void go();
}

2、定义Car汽车对象

/*** @description: 汽车对象* @author: flygo* @time: 2022/7/5 10:00*/
public class Car implements Movable {@Overridepublic void go() {System.out.println("Car go...");}
}

3、定义Plane飞机对象

/*** @description: 飞机对象* @author: flygo* @time: 2022/7/5 10:01*/
public class Plane implements Movable {@Overridepublic void go() {System.out.println("plane go...");}
}

4、定义汽车工厂类

/*** @description: 汽车工厂类* @author: flygo* @time: 2022/7/5 10:03*/
public class CarFactory {Movable create() {return new Car();}
}

5、定义飞机工厂类

/*** @description: 飞机工程类* @author: flygo* @time: 2022/7/5 10:04*/
public class PlaneFactory {Movable create() {return new Plane();}
}

6、定义主方法类

/*** @description: 主方法* @author: flygo* @time: 2022/7/5 10:01*/
public class FactoryMain {public static void main(String[] args) {Movable carMovable = new CarFactory().create();carMovable.go();Movable planeMovable = new PlaneFactory().create();planeMovable.go();}
}

三、简单工厂方法

/*** @description: 简单工厂方法* @author: flygo* @time: 2022/7/5 10:11*/
public class SimpleVehicleFactory {public Car createCar() {return new Car();}public Plane createPlane() {return new Plane();}
}

四、AbstractFactory抽象方法

例子描述:假如魔法人现代人两种类型的人,两种人都有食物武器交通工具三种产品

  • 三种产品描述
    • 食物:输出食物名称方法(printName())
    • 武器:射击方法(shoot())
    • 交通工具:驾驶方法(go())
  • 魔法人三种具体产品是:
    • 食物:毒蘑菇
    • 武器:魔法棒
    • 交通工具:魔法扫帚
  • 现代人三种具体的产品是:
    • 食物:面包
    • 武器:AK47
    • 交通工具:汽车

通过不同的工厂抽象方法实现不同人的所拥有的不同产品族

1、定义抽象工厂、抽象产品类和方法

1.1、AbstractFactory 抽象工厂

/*** @description: 抽象工程方法* @author: flygo* @time: 2022/7/5 11:02*/
public abstract class AbstractFactory {public abstract AbstractFood createFood();public abstract AbstractVehicle createVehicle();public abstract AbstractWeapon createWeapon();
}

1.2、AbstractFood 抽象的食物

/*** @description: 抽象的食物* @author: flygo* @time: 2022/7/5 11:03*/
public abstract class AbstractFood {public abstract void printName();
}

1.3、AbstractVehicle抽象的交通工具

/*** @description: 抽象的交通工具* @author: flygo* @time: 2022/7/5 11:04*/
public abstract class AbstractVehicle {public abstract void go();
}

1.4、AbstractVehicle抽象的武器

/*** @description: 抽象的武器* @author: flygo* @time: 2022/7/5 11:06*/
public abstract class AbstractWeapon {public abstract void shoot();
}

2、定义魔法人具体工厂、产品类和方法

2.1、MagicFactory 魔法工厂类

MagicFactory 魔法工厂类 继承AbstractFactory 抽象工厂,同时实现抽象工厂方法

import tech.flygo.factory.abstractfactory.abstractf.AbstractFactory;
import tech.flygo.factory.abstractfactory.abstractf.AbstractFood;
import tech.flygo.factory.abstractfactory.abstractf.AbstractVehicle;
import tech.flygo.factory.abstractfactory.abstractf.AbstractWeapon;/*** @description: 魔法工厂类* @author: flygo* @time: 2022/7/5 11:07*/
public class MagicFactory extends AbstractFactory {@Overridepublic AbstractFood createFood() {return new MashRoom();}@Overridepublic AbstractVehicle createVehicle() {return new Broom();}@Overridepublic AbstractWeapon createWeapon() {return new MagicStick();}
}

2.2、MashRoom 魔法蘑菇食物

MashRoom 魔法蘑菇食物 继承AbstractFood 抽象类型,同时实现抽象方法

import tech.flygo.factory.abstractfactory.abstractf.AbstractFood;/*** @description: 魔法蘑菇食物* @author: flygo* @time: 2022/7/5 11:13*/
public class MashRoom extends AbstractFood {@Overridepublic void printName() {System.out.println("MashRoom food...");}
}

2.3、MagicStick 魔法棒定义

MagicStick 魔法棒 继承AbstractWeapon 抽象类型,同时实现抽象方法

import tech.flygo.factory.abstractfactory.abstractf.AbstractWeapon;/*** @description: 魔法棒* @author: flygo* @time: 2022/7/5 11:15*/
public class MagicStick extends AbstractWeapon {@Overridepublic void shoot() {System.out.println("MagicStick shoot...");}
}

2.4、Broom 魔法棒定义

Broom 魔法扫帚 继承AbstractVehicle 抽象类型,同时实现抽象方法

import tech.flygo.factory.abstractfactory.abstractf.AbstractVehicle;/*** @description: 魔法扫帚* @author: flygo* @time: 2022/7/5 11:11*/
public class Broom extends AbstractVehicle {@Overridepublic void go() {System.out.println("Broom go...");}
}

3、定义现代人具体工厂、产品类和方法

3.1、ModernFactory 现代工厂类

ModernFactory 现代工厂类 继承AbstractFactory 抽象工厂,同时实现抽象工厂方法

import tech.flygo.factory.abstractfactory.abstractf.AbstractFactory;
import tech.flygo.factory.abstractfactory.abstractf.AbstractFood;
import tech.flygo.factory.abstractfactory.abstractf.AbstractVehicle;
import tech.flygo.factory.abstractfactory.abstractf.AbstractWeapon;/*** @description: 现代工厂类* @author: flygo* @time: 2022/7/5 11:16*/
public class ModernFactory extends AbstractFactory {@Overridepublic AbstractFood createFood() {return new Bread();}@Overridepublic AbstractVehicle createVehicle() {return new Car();}@Overridepublic AbstractWeapon createWeapon() {return new AK47();}
}

3.2、Bread 面包食物

Bread 面包食物食物 继承AbstractFood 抽象类型,同时实现抽象方法

import tech.flygo.factory.abstractfactory.abstractf.AbstractFood;/*** @description: 面包食物* @author: flygo* @time: 2022/7/5 11:18*/
public class Bread extends AbstractFood {@Overridepublic void printName() {System.out.println("Bread...");}
}

3.3、AK47 武器AK47

AK47 武器AK47 继承AbstractWeapon 抽象类型,同时实现抽象方法

import tech.flygo.factory.abstractfactory.abstractf.AbstractWeapon;/*** @description: 武器AK47* @author: flygo* @time: 2022/7/5 11:19*/
public class AK47 extends AbstractWeapon {@Overridepublic void shoot() {System.out.println("AK47 shoot...");}
}

3.4、Car汽车类定义

Car 汽车类 继承AbstractVehicle 抽象类型,同时实现抽象方法

import tech.flygo.factory.abstractfactory.abstractf.AbstractVehicle;/*** @description: 汽车类* @author: flygo* @time: 2022/7/5 11:17*/
public class Car extends AbstractVehicle {@Overridepublic void go() {System.out.println("Car go...");}
}

4、定义 AbstractFactoryMain 抽象工厂方法主方法类

import tech.flygo.factory.abstractfactory.abstractf.AbstractFactory;
import tech.flygo.factory.abstractfactory.abstractf.AbstractFood;
import tech.flygo.factory.abstractfactory.abstractf.AbstractVehicle;
import tech.flygo.factory.abstractfactory.abstractf.AbstractWeapon;
import tech.flygo.factory.abstractfactory.magic.MagicFactory;/*** @description: 抽象工厂方法主方法类* @author: flygo* @time: 2022/7/5 11:03*/
public class AbstractFactoryMain {public static void main(String[] args) {System.out.println("-------生成一组产品族(魔法)-------");// 生成一组产品族(魔法)AbstractFactory magicFactory = new MagicFactory();AbstractFood food1 = magicFactory.createFood();food1.printName();AbstractWeapon weapon1 = magicFactory.createWeapon();weapon1.shoot();AbstractVehicle vehicle1 = magicFactory.createVehicle();vehicle1.go();System.out.println("-------生成一组产品族(现代)-------");// 生成一组产品族(现代)AbstractFactory modernFactory = new MagicFactory();AbstractFood food2 = modernFactory.createFood();food2.printName();AbstractWeapon weapon2 = modernFactory.createWeapon();weapon2.shoot();AbstractVehicle vehicle2 = modernFactory.createVehicle();vehicle2.go();}
}

输出结果

四、源码地址

GitHub - jxaufang168/Design-Patterns: 设计模式学习设计模式学习. Contribute to jxaufang168/Design-Patterns development by creating an account on GitHub.icon-default.png?t=N7T8https://github.com/jxaufang168/Design-Patterns