从筷子的生产说到工厂方法

工厂方法是一种创建型生产模式。在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型。

理解

按照我的理解,工厂方法主要的意图是隐藏new方法,封装对象的创建方法,让使用者更关注对象本身,而不是如何创建这个对象。接下来我们用筷子生产线的例子来感受一下工厂方法。

筷子生产线

定义产品接口

首先我们定义一下产品的接口,也就是筷子

/**
 * @author wangxing
 */
public interface Chopsticks {

    /**
     * 使用
     */
    void use();

    /**
     * 回收
     */
    void recycle();
}

定义工厂接口

然后我们定义一下筷子的工厂

/**
 * 筷子工厂
 * @author wangxing
 */
public interface ChopsticksFactory {

    /**
     * 生产筷子
     *
     * @param user 筷子的使用者
     * @return 筷子
     */
    Chopsticks create(String user);
}

定义具体的工厂和产品

竹筷子工厂和竹筷子

/**
 * 竹筷子
 *
 * @author wangxing
 */
public class BambooChopsticks implements Chopsticks {
    @Override
    public void use() {
        System.out.println("从塑料袋里拿出来,掰开,夹菜");
    }

    @Override
    public void recycle() {
        System.out.println("扔掉");
    }
}

因为竹筷子是一次性的,所以每次都直接new出来一个新的竹筷子

/**
 * 竹筷子工厂
 * @author wangxing
 */
public class BambooChopsticksFactory implements ChopsticksFactory{
    @Override
    public Chopsticks create(String user) {
        System.out.println(user+"来了,给他一双一次性筷子");
        return new BambooChopsticks();
    }
}

木筷子工厂和木筷子

/**
 * 木头筷子
 *
 * @author wangxing
 */
public class WoodChopsticks implements Chopsticks {
    @Override
    public void use() {
        System.out.println("从饭盒里拿出来,夹菜");
    }

    @Override
    public void recycle() {
        System.out.println("洗干净,放回到饭盒里");
    }
}

一般木筷子都是反复使用的,所以不会每次都new新的筷子,而是先看缓存里是否有筷子了,没有筷子再new筷子,有筷子时就直接取出筷子。

/**
 * 木筷子工厂
 *
 * @author wangxing
 */
public class WoodChopsticksFactory implements ChopsticksFactory {
    private static final ConcurrentHashMap<String, Chopsticks> cache = new ConcurrentHashMap<>();

    @Override
    public Chopsticks create(String user) {
        System.out.println(user + "来了,把属于他的那双筷子给他了");
        return cache.computeIfAbsent(user, (k) -> new WoodChopsticks());
    }
}

使用工厂

  • 大家都使用一次性筷子

    public class Main {
        public static void main(String[] args) {
            String[] users = {"张三", "李四", "王五", "赵柳", "二麻子"};
            ChopsticksFactory chopsticksFactory = new BambooChopsticksFactory();
            for (String user : users) {
                Chopsticks chopsticks = chopsticksFactory.create(user);
                chopsticks.use();
                chopsticks.recycle();
            }
        }
    }
    
  • 大家都使用木筷子

    public class Main {
        public static void main(String[] args) {
            String[] users = {"张三", "李四", "王五", "赵柳", "二麻子"};
            ChopsticksFactory chopsticksFactory = new WoodChopsticksFactory();
            for (String user : users) {
                Chopsticks chopsticks = chopsticksFactory.create(user);
                chopsticks.use();
                chopsticks.recycle();
            }
        }
    }
    

工厂方法

  1. 会到头来,我们再体会一下什么是工厂方法。在上面的例子中工厂方法说的就是ChopsticksFactory#createChopsticksFactory作为工厂,定义了什么是筷子(Chopsticks)以及要干什么(create)。具体要如何生产、生产出什么样的筷子,都是子类(BambooChopsticksFactory,WoodChopsticksFactory)来决定的。所以才会有工厂方法使一个类的实例化延迟到子类的说法。
  2. 同时,因为使用工厂方法封装了对象new的过程,所以我们可以控制对象的创建。比如竹筷子是一次性的,那我们就每次都new一个新的出来。但是木筷子是循环使用的,所以我们采用缓存的方式将对象缓存起来
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值