简单工厂和工厂方法一起
package org.example.ms.factory.factorymethod;
/**
* @author Gavin.luo
* @title: Moveable
* @projectName MyData
* @description:
* @date 2022/3/10 9:18
*/
public interface Moveable {
void go();
}
package org.example.ms.factory.factorymethod;
/**
* @author Gavin.luo
* @title: Car
* @projectName MyData
* @description:
* @date 2022/3/8 16:58
*/
public class Car implements Moveable {
public void go(){
System.out.println("car go------------------->");
}
}
package org.example.ms.factory.factorymethod;
/**
* @author Gavin.luo
* @title: CarFactory
* @projectName MyData
* @description:
* @date 2022/3/10 9:58
*/
public class CarFactory {
public Moveable create(){
System.out.println("a car create-------------------------->");
return new Car();
}
}
package org.example.ms.factory.factorymethod;
/**
* @author Gavin.luo
* @title: Plane
* @projectName MyData
* @description:
* @date 2022/3/10 9:15
*/
public class Plane implements Moveable{
public void go(){
System.out.println("plane fly------------------->");
}
}
package org.example.ms.factory.factorymethod;
/**
* @author Gavin.luo
* @title: PlaneFactory
* @projectName MyData
* @description:
* @date 2022/3/10 9:59
*/
public class PlaneFactory {
public Moveable create(){
System.out.println("a plane create --------------->");
return new Plane();
}
}
package org.example.ms.factory.factorymethod;
/**
* @author Gavin.luo
* @title: VehicleFactory
* @projectName MyData
* @description: 简单工厂的扩展性不好
* @date 2022/3/10 9:33
*/
public class SimpleVehicleFactory {
public Car createCar(){
//before processing 可以在创建之前做一些操作 比如加权限
return new Car();
}
public Plane createPlane(){
//before processing 可以在创建之前做一些操作 比如加权限
return new Plane();
}
public Broom createBroom(){
//before processing 可以在创建之前做一些操作 比如加权限
return new Broom();
}
}
package org.example.ms.factory.factorymethod;
/**
* @author Gavin.luo
* @title: Test
* @projectName MyData
* @description:
* @date 2022/3/8 16:57
*/
public class Test {
public static void main(String[] args) {
// Car car=new Car();
// car.go();
// Plane plane=new Plane();
// plane.go();
Moveable moveable=new Car();
moveable.go();
//简单工厂使用
SimpleVehicleFactory vehicleFactory=new SimpleVehicleFactory();
vehicleFactory.createCar().go();
Moveable m=new CarFactory().create();
m.go();
Moveable mf=new PlaneFactory().create();
mf.go();
}
}
抽象工厂
在未使用抽象工厂前的代码
package org.example.ms.factory.abstractfactory;
/**
* @author Gavin.luo
* @title: Ak47
* @projectName MyData
* @description:
* @date 2022/3/10 10:19
*/
public class Ak47 {
public void shoot(){
System.out.println("tu tutututu----------->");
}
}
package org.example.ms.factory.abstractfactory;
/**
* @author Gavin.luo
* @title: Bread
* @projectName MyData
* @description:
* @date 2022/3/10 10:20
*/
public class Bread {
public void printName(){
System.out.println("味多美---------->");
}
}
package org.example.ms.factory.abstractfactory;
/**
* @author Gavin.luo
* @title: Car
* @projectName MyData
* @description:
* @date 2022/3/10 10:19
*/
public class Car {
public void go(){
System.out.println("car go---------------->");
}
}
package org.example.ms.factory.abstractfactory;
/**
* @author Gavin.luo
* @title: Broom
* @projectName MyData
* @description:
* @date 2022/3/10 10:26
*/
public class Broom {
public void go(){
System.out.println("骑着扫把飞-------》");
}
}
package org.example.ms.factory.abstractfactory;
/**
* @author Gavin.luo
* @title: MagicStick
* @projectName MyData
* @description:
* @date 2022/3/10 10:25
*/
public class MagicStick {
public void shoot(){
System.out.println("电击-----》");
}
}
package org.example.ms.factory.abstractfactory;
/**
* @author Gavin.luo
* @title: MushRoom
* @projectName MyData
* @description:
* @date 2022/3/10 10:26
*/
public class MushRoom {
public void printName(){
System.out.println("吃毒蘑菇------》");
}
}
调用是这样子的,每当我要增加某一种品类的时候就要加很多代码,比如再加外星人呢?
package org.example.ms.factory.abstractfactory;
/**
* @author Gavin.luo
* @title: Test
* @projectName MyData
* @description:
* @date 2022/3/10 10:21
*/
public class Test {
public static void main(String[] args) {
//现代人
//一个司机开着车 吃着面包 开着枪
System.out.println("现代人");
Car c=new Car();
c.go();
Bread b=new Bread();
b.printName();
Ak47 a=new Ak47();
a.shoot();
//魔法世界的人
//一个法师骑着扫把,吃着毒蘑菇,使用魔法棒
System.out.println("魔法世界的人");
Broom broom=new Broom();
broom.go();
MushRoom mushRoom=new MushRoom();
mushRoom.printName();
MagicStick magicStick=new MagicStick();
magicStick.shoot();
}
}
使用抽象工厂后的代码如下
package org.example.ms.factory.abstractfactory;
/**
* @author Gavin.luo
* @title: AbstractFactory
* @projectName MyData
* @description:
* @date 2022/3/10 10:35
*/
public abstract class AbstractFactory {
//交通工具
abstract Vehicle createVhicel();
//食物
abstract Food createFood();
//武器
abstract Weapon crateWeapon();
}
package org.example.ms.factory.abstractfactory;
/**
* @author Gavin.luo
* @title: ModernFactory
* @projectName MyData
* @description: 魔法世界的工厂
* @date 2022/3/10 11:24
*/
public class MagicFactory extends AbstractFactory{
@Override
Vehicle createVhicel() {
return new Broom();
}
@Override
Food createFood() {
return new MushRoom();
}
@Override
Weapon crateWeapon() {
return new MagicStick();
}
}
package org.example.ms.factory.abstractfactory;
/**
* @author Gavin.luo
* @title: FoodFactory
* @projectName MyData
* @description: 食物
* @date 2022/3/10 10:36
*/
public abstract class Food {
abstract void printName();
}
package org.example.ms.factory.abstractfactory;
/**
* @author Gavin.luo
* @title: Vehicle
* @projectName MyData
* @description:交通工具
* @date 2022/3/10 10:39
*/
public abstract class Vehicle {
abstract void go();
}
package org.example.ms.factory.abstractfactory;
/**
* @author Gavin.luo
* @title: Weapon
* @projectName MyData
* @description: 武器射击
* @date 2022/3/10 10:37
*/
public abstract class Weapon {
abstract void shoot();
}
package org.example.ms.factory.abstractfactory;
/**
* @author Gavin.luo
* @title: Ak47
* @projectName MyData
* @description:
* @date 2022/3/10 10:19
*/
public class Ak47 extends Weapon{
public void shoot(){
System.out.println("tu tutututu----------->");
}
}
package org.example.ms.factory.abstractfactory;
/**
* @author Gavin.luo
* @title: Bread
* @projectName MyData
* @description:
* @date 2022/3/10 10:20
*/
public class Bread extends Food{
public void printName(){
System.out.println("味多美---------->");
}
}
package org.example.ms.factory.abstractfactory;
/**
* @author Gavin.luo
* @title: Broom
* @projectName MyData
* @description:
* @date 2022/3/10 10:26
*/
public class Broom extends Vehicle{
public void go(){
System.out.println("骑着扫把飞-------》");
}
}
package org.example.ms.factory.abstractfactory;
/**
* @author Gavin.luo
* @title: Car
* @projectName MyData
* @description:
* @date 2022/3/10 10:19
*/
public class Car extends Vehicle{
public void go(){
System.out.println("car go---------------->");
}
}
package org.example.ms.factory.abstractfactory;
/**
* @author Gavin.luo
* @title: MagicStick
* @projectName MyData
* @description:
* @date 2022/3/10 10:25
*/
public class MagicStick extends Weapon{
public void shoot(){
System.out.println("电击-----》");
}
}
package org.example.ms.factory.abstractfactory;
/**
* @author Gavin.luo
* @title: MushRoom
* @projectName MyData
* @description:
* @date 2022/3/10 10:26
*/
public class MushRoom extends Food{
public void printName(){
System.out.println("吃毒蘑菇------》");
}
}
package org.example.ms.factory.abstractfactory;
/**
* @author Gavin.luo
* @title: Test
* @projectName MyData
* @description:
* @date 2022/3/10 10:21
*/
public class Test {
public static void main(String[] args) {
//现代人
//一个司机开着车 吃着面包 开着枪
System.out.println("现代人");
Car c=new Car();
c.go();
Bread b=new Bread();
b.printName();
Ak47 a=new Ak47();
a.shoot();
//魔法世界的人
//一个法师骑着扫把,吃着毒蘑菇,使用魔法棒
System.out.println("魔法世界的人");
Broom broom=new Broom();
broom.go();
MushRoom mushRoom=new MushRoom();
mushRoom.printName();
MagicStick magicStick=new MagicStick();
magicStick.shoot();
System.out.println("------------------------------");
//使用了抽象工厂后的代码
//人类
System.out.println("现代人");
AbstractFactory modernFactory=new ModernFactory();
modernFactory.createVhicel().go();
modernFactory.createFood().printName();
modernFactory.crateWeapon().shoot();
//魔法世界的人
System.out.println("魔法世界的人");
AbstractFactory magicFactory=new MagicFactory();
magicFactory.createVhicel().go();
magicFactory.createFood().printName();
magicFactory.crateWeapon().shoot();
//就算以后要增加外星人、底下人、宇宙人 只需要增加抽象工厂和具体的实现,可随意扩展
}
}
那么问题来了
我们进行优化
那就是SpringBean工厂