设计模式模块学习之工厂模式

工厂模式有三种:简单工厂,工厂方法,抽象工厂
简单工厂
简单工厂比较简单,就是封装一层生成对象的类,所有生成对象都放在这个类,可以把生成对象的任意类称为简单工厂
在这里插入图片描述

工厂方法:
工厂方法跟简单工厂不一样的地方在于每个对象都有其对应的工厂类生成,利于扩展,遵循开闭原则,单一原则
在这里插入图片描述
以下模拟场景,人开车,开飞机

定义交通工具抽象类

public abstract class Vehicles {
    abstract void go();
}

定义工厂抽象类

public abstract class ViheclesFactory {
    abstract Vehicles create();
}

定义Car类继承工具抽象类

public class Car extends Vehicles {
    @Override
    public void go() {
        System.out.println("开汽车 嘟嘟嘟嘟");
    }
}

定义Car工厂继承工厂抽象类,造车开始

public class CarFactory extends ViheclesFactory{
    @Override
    public Vehicles create(){
        return new Car();

    }
}

测试

public class Test {
    public static void main(String[] args) {
        ViheclesFactory factory = new CarFactory();
        Vehicles vehicles = factory.create();
        vehicles.go();
    }
}

这样之后想开飞机,就定义飞机类继承工具抽象类和飞机工厂类继承工厂抽象类就可以了,这就是工厂方法

抽象工厂:
可以理解工厂方法就是简单版的抽象工厂,工厂方法是利于产品的扩展,而抽象工厂是利于产品一族的扩展,不利于产品的扩展,两者侧重点不一样
在这里插入图片描述
以下模拟场景,普通人开车,吃饭,武器

定义食物、武器、交通工具、工厂抽象类

public abstract class Food {
    abstract void eat();
}
public abstract class Wepean {
    abstract void shoot();
}
public abstract class Vehicle {
    abstract void go();
}
public abstract class AbstractFactory {
    abstract Food creatFood();
    abstract Vehicle creatVehicle();
    abstract Wepean createWepean();
}

定义普通人吃的东西,开的车,用的武器

public class Bread extends Food{
    @Override
    void eat() {
        System.out.println("吃面包 ++++++++");
    }
}
public class Car extends Vehicle {
    @Override
    public void go() {
        System.out.println("开汽车 ----------");
    }
}
public class Ak47 extends Wepean {
    @Override
    void shoot() {
        System.out.println("AK47 =============");
    }
}

定义普通人的工厂

public class DiQiuRenFactory extends AbstractFactory {
    @Override
    Food creatFood() {
        return new Bread();
    }

    @Override
    Vehicle creatVehicle() {
        return new Car();
    }

    @Override
    Wepean createWepean() {
        return new Ak47();
    }
}

测试

public class Test {
    public static void main(String[] args) {
        AbstractFactory factory = new HuoXingRenFactory();
        factory.createWepean().shoot();
        factory.creatFood().eat();
        factory.creatVehicle().go();
    }
}

这样一个产品族就定义成功了,之后再想扩展火星人一族,就可以定义火星人吃的饭,开的车,用的武器和火星人工厂就行了;
但是想要扩展产品,也就是想加一个普通人说话的场景,那改动就有点大了,而且违背了开闭原则,所以抽象工厂在产品族的维度上容易扩展,在产品的维度上扩展难
所以设计模式没有好坏之分,只有合适的才是最好的,任何东西都是,这就需要在项目开展前期在业务的理解基础上定义项目框架

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值