java & 设计模式 & 工厂模式

124 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情

简单工厂模式介绍

  1. 简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出那一种产品的类的实例。简单工厂模式是工厂模式家族中最简单使用模式。
  2. 简单工厂模式:顶一个创建对象的类,有这类来封装实例化对象的行为代码
  3. 在软件开发中,当我们会用到大量的创建某种 某类或者某批对象时,就会使用到工厂模式。

下面我们使用一个简单的例子来使用一下

简单的需求:

  • 文具店线上出售商品:要求文具种类的便于维护和扩展。
  • 文具种类很多如:钢笔,书本等等。
  • 线上售卖流程:备货,打包,发货

首先准备一个抽象类

public abstract class ShopStationery {

    private String name;
    //特殊方法子类去重写
    public  abstract void prepare();
    //通用方法
    public void stockUp(){
        System.out.println("文具"+name+"备货完成.....");
    }

    public void box(){
        System.out.println("文具"+name+"打包.....");
    }

    public void sendTo(){
        System.out.println("文具"+name+"发货.....");
    }
    public String setName(String book) {
        return name=book;
    }
}

准备文具Book很 pen 类继承抽象类

public class StationeryBook extends ShopStationery{
    @Override
    public void prepare() {
        System.out.println("文具钢笔 仓库出货中.........");
    }
}
public class StationeryPen extends ShopStationery{
    @Override
    public void prepare() {
        System.out.println("文具钢笔 仓库出货中.........");
    }
}

准备简单的工厂类

public class StationeryFactory {
    public static ShopStationery  createShopStationery(String type){
        ShopStationery shopStationery=null;
        if(type.equals("book")){
            shopStationery=new StationeryBook();
            shopStationery.setName("book");
        }else if(type.equals("pen")){
            shopStationery = new StationeryPen();
            shopStationery.setName("pen");
        }
        return  shopStationery;
    }
}

准备一个下单用的测试类

运行测试:

public class CreateOrder {


    public static void main(String[] args) {
        ShopStationery pen = StationeryFactory.createShopStationery("pen");
        pen.prepare();
        pen.stockUp();
        pen.box();
        pen.sendTo();
    }
}

输出结果:

文具钢笔 仓库出货中.........
文具pen备货完成.....
文具pen打包.....
文具pen发货.....

简单工厂模式也叫静态工厂模式,上面我们用到的就是静态工厂模式。文具具体类创建扩展不会影响到 创建订单通过工厂类完成相当于做一个预处理再去工厂类根据具体的文具在去创建对应的。

使用工厂方法模式

工厂对象设置一个抽象方法

public abstract class StationeryFactoryMethod {
   abstract ShopStationery create(String type);
}

使用图书订单子类去继承抽象工厂

public class CreateBookOrder extends StationeryFactoryMethod{

    @Override
    ShopStationery create(String type) {
        ShopStationery shopStationery=null;
            if(type.equals("bj")){
                shopStationery =new StationeryBookBj();
            }else{
                shopStationery =new StationeryBook();
            }
        shopStationery.setName("book 大话西游");
            return  shopStationery;
    }
}

下面我们使用 子类去创建订单
bj地区:

public static void main(String[] args) {
    CreateBookOrder createOrder = new CreateBookOrder();
    ShopStationery shopStationery = createOrder.create("bj");
    shopStationery.prepare();
    shopStationery.stockUp();
    shopStationery.box();
    shopStationery.sendTo();
}

结果:

北京仓库的Book....
文具book 大话西游备货完成.....
文具book 大话西游打包.....
文具book 大话西游发货.....

使用其他地区时:

public static void main(String[] args) {
    CreateBookOrder createOrder = new CreateBookOrder();
    ShopStationery shopStationery = createOrder.create("aj");
    shopStationery.prepare();
    shopStationery.stockUp();
    shopStationery.box();
    shopStationery.sendTo();
}

结果:

其他仓库的Book....
文具book 大话西游备货完成.....
文具book 大话西游打包.....
文具book 大话西游发货.....

抽象工厂模式

抽象工厂模式:定义一个interface 用于创建相关或有依赖关系的对象簇,无需知名具体的类。 抽象工厂模式可以理解为将简单工厂模式和方法模式的整合就是对上面两种的改进,更有利于代码的扩展。

创建接口

public interface AbsFactory {
    ShopStationery create(String type);
}

使用工厂子类去实现它

public class StationeryBookBjIn implements AbsFactory{

    @Override
    public ShopStationery create(String type) {
        ShopStationery shopStationery=null;
        if(type.equals("bj")){
            shopStationery =new StationeryBookBj();
        }else{
            shopStationery =new StationeryBook();
        }
        shopStationery.setName("book 大话西游");
        return  shopStationery;
    }
}

测试:

public static void main(String[] args) {
    StationeryBookBjIn stationeryBookBjIn = new StationeryBookBjIn();
    ShopStationery shopStationery = stationeryBookBjIn.create("bj");
    shopStationery.prepare();
    shopStationery.stockUp();
    shopStationery.box();
    shopStationery.sendTo();

}

结果:

北京仓库的Book....
文具book 大话西游备货完成.....
文具book 大话西游打包.....
文具book 大话西游发货.....

其他的工厂子类直接实现接口重写方法就可以了。

实践是检验真理的唯一方法! 明天见🥰🥰🥰