26种设计模式之工厂模式

今天整理的工厂模式,借鉴与Java与模式一书
以一个农场为例,来实现一个简单的Demo

1.简单工厂模式(SimpleFactory)

假如说现在有一家农场,该农场先外提供水果,包括苹果和香蕉;
因为业务比较小,农场提供的苹果和香蕉都是装在一模一样的水果箱里的;
同时我有专门提供水果的工厂,把苹果和香蕉生产出来以后,直接装进水果箱,所以外界只知道是水果但是不知道是什么水果;
图解分析
这里写图片描述
水果箱

package com.lizhenbo.simplefactory;
/**
 * 可以理解为水果箱
 * 水果接口,所有的水果必须实现该接口(这里可以定义为抽象类也合适)
 * @author LIZHENBO
 */
public interface IFruit {
    //收获
    void harvest();
}

苹果

package com.lizhenbo.simplefactory;
/**
 * 具体的苹果类
 * @author LIZHENBO
 */
public class Apple implements IFruit {

    @Override
    public void harvest() {
        System.out.println("收获一个苹果!");
    }

}

香蕉

package com.lizhenbo.simplefactory;
/**
 * 具体的水果类,香蕉
 * @author LIZHENBO
 *
 */
public class Banana implements IFruit {

    @Override
    public void harvest() {
        System.out.println("收获一根香蕉!");
    }
}

水果工厂

package com.lizhenbo.simplefactory;
/**
 * 水果工厂,用来创建所有的水果
 * @author LIZHENBO
 */
public class FruitFactory {

    public static IFruit createFruit(int whichFruit){
        IFruit fruit = null;
        switch (whichFruit) {
        case 0:
            fruit= new Apple();//创建苹果
            break;
        case 1:
            fruit= new Banana();//创建香蕉
            break;
        }
        return fruit;
    }
}

测试类

package com.lizhenbo.simplefactory;

public class SimpleFactoryTest {

    public static void main(String[] args) {

        IFruit fruit = FruitFactory.createFruit(0);
        IFruit fruit2 = FruitFactory.createFruit(1);
        fruit.harvest();
        fruit2.harvest();
    }
}

运行结果:
这里写图片描述

2.工厂方法模式

后来农场的业务做大了,想把工厂的任务细分化,创建两个工厂;
苹果工厂专门生成苹果;
香蕉工厂专门生成香蕉
图解分析
这里写图片描述
水果箱同上
苹果同上
香蕉同上
水果工厂接口

package com.lizhenbo.factorymethod;
/**
 * 水果工厂接口,所有的水果工厂必须实现该接口
 * @author LIZHENBO
 */
public interface IFruitFactory {
    IFruit createFruit();
}

苹果工厂

package com.lizhenbo.factorymethod;
/**
 * 苹果工厂来专门创建苹果的工厂
 * @author LIZHENBO
 */
public class AppleFactory implements IFruitFactory{

    @Override
    public IFruit createFruit() {
        return new Apple();
    }

}

香蕉工厂

package com.lizhenbo.factorymethod;
/**
 * 香蕉工厂,专门创建香蕉的工厂
 * @author LIZHENBO
 *
 */
public class BananaFactory implements IFruitFactory{

    @Override
    public IFruit createFruit() {
        return new Banana();
    }

}

测试类

package com.lizhenbo.factorymethod;

public class FactoryMethodTest {

    public static void main(String[] args) {

        IFruit fruit = new AppleFactory().createFruit();
        IFruit fruit2 = new BananaFactory().createFruit();
        fruit.harvest();
        fruit2.harvest();
    }
}

运行结果
这里写图片描述

3.抽象工厂模式

假如老板想扩展业务,
在北方创建一个工厂生产北方的水果和蔬菜;
在南方创建一个工厂生产南方的水果和蔬菜;
图解分析
这里写图片描述
水果箱同上
苹果同上
香蕉同上
蔬菜箱

package com.lizhenbo.abstractfactory;
/**
 * 蔬菜接口,所有的蔬菜都要实现该接口
 * @author LIZHENBO
 *
 */
public interface IVegetable {

    void harvest_Vegetable();

}

北方蔬菜

package com.lizhenbo.abstractfactory;

public class NorthVegetable implements IVegetable{

    @Override
    public void harvest_Vegetable() {
        System.out.println("收获北方蔬菜!");
    }

}

南方蔬菜

package com.lizhenbo.abstractfactory;

public class SouthVegetable implements IVegetable{

    @Override
    public void harvest_Vegetable() {
        System.out.println("收获南方蔬菜!");
    }

}

工厂接口

package com.lizhenbo.abstractfactory;
/**
 * 工厂接口,所有的工厂必须实现该接口
 * @author LIZHENBO
 */
public interface IFactory {
    IFruit createFruit();
    IVegetable createVegetable();
}

北方工厂

package com.lizhenbo.abstractfactory;
/**
 * 北方工厂来专门创建苹果和北方蔬菜的工厂
 * @author LIZHENBO
 */
public class NorthFactory implements IFactory{

    @Override
    public IFruit createFruit() {
        return new Apple();
    }

    @Override
    public IVegetable createVegetable() {
        return new NorthVegetable();
    }

}

南方工厂

package com.lizhenbo.abstractfactory;
/**
 * 南方水果蔬菜工厂,专门创建香蕉和南方蔬菜的工厂
 * @author LIZHENBO
 *
 */
public class SouthFactory implements IFactory{

    @Override
    public IFruit createFruit() {
        return new Banana();
    }

    @Override
    public IVegetable createVegetable() {
        return new SouthVegetable();
    }

}

测试类

package com.lizhenbo.abstractfactory;

public class AbstractFactoryTest {

    public static void main(String[] args) {

        IFruit fruit = new NorthFactory().createFruit();
        IFruit fruit2 = new SouthFactory().createFruit();

        IVegetable vegetable = new NorthFactory().createVegetable();
        IVegetable vegetable2 = new SouthFactory().createVegetable();

        fruit.harvest_Fruit();
        fruit2.harvest_Fruit();

        vegetable.harvest_Vegetable();
        vegetable2.harvest_Vegetable();
    }
}

运行结果
这里写图片描述

最后GitHub地址:https://github.com/zhenbo929/FactoryDemo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值