Java设计模式之工厂方法模式

Java23种设计模式

由于简单工厂模式违背了开闭原则,为了解决开闭原则的问题,我们引出今天的主角:工厂方法模式。

定义:为不同产品提供不同的工厂实现类,调用不同工厂实现类初始化不同工厂实例。

  1. 首先我们创Fruit接口:所有的水果只有一个方法tellme,调用就能知道水果的相关信息。
    interface Fruit{
        void tellMe();
    }
    
  2. 水果有一个可选方法就是告诉客户怎么吃,所以创建一个工具类:
    static class How{
        String howToEat(String name){
            if(name.equals("apple")){
                return "削皮吃";
            }else if(name.equals("banana")){
                return "剥皮吃";
            }
            return "不知道什么水果,不知道怎么吃";
        }
    }
    
  3. 创建苹果工厂类,实现Fruit接口,内部可以实现告诉客户这是什么水果?怎么吃?
    static class Apple implements Fruit{
        @Override
        public void tellMe() {
            System.out.print("水果名为苹果\n");
            String howToEat = new How().howToEat("apple");
            System.out.print("吃法为:"+howToEat+"\n");
        }
    }
    
  4. 客户调用:
    public static void main(String[] args) {
        new Apple().tellMe();
    }
    
    打印结果:
    水果名为苹果
    吃法为:削皮吃
    
  5. 如果我们又想要一个香蕉工厂呢?那么址需要添加一个Banana类:
    static class Banana implements Fruit{
        @Override
        public void tellMe() {
            System.out.print("水果名为香蕉\n");
            String howToEat = new How().howToEat("banana");
            System.out.print("吃法为:"+howToEat+"\n");
        }
    }
    public static void main(String[] args) {
        new Banana().tellMe();
    }
    
  6. 打印结果:
    水果名为香蕉
    吃法为:剥皮吃
    

上面例子可以看出来:

  1. 我们只是调用了Apple工厂这个类的tellMe方法,工厂自动告诉了我们水果名和吃法,我们不需要知道具体的过程,有时候也不需要知道具体结果,实现了调用者和工厂内部功能的完全分离。
  2. 如果我们需要知道香蕉的详细信息,那么Apple工厂就不能满足我们的需求了,我们需要再创建一个Banana工厂,这就是工厂方法模式。

总结优点:

1、一个调用者想创建一个对象,只要知道其名称就可以了。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
3、屏蔽产品的具体实现,调用者只关心产品的接口。
4、解决了简单工厂模式违背开闭原则的问题。

相关模式:抽象工厂模式

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值