java设计模式之工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)

1、工厂模式的作用和目的:

  降低代码的耦合性,并提高代码的复用率。在一个很大的项目中假如很多地方都要用到类A,那么要new很多次A,一旦类A的需求 改变,那么就要修改很多地方。不仅耗时费力而且在修改的过程中极易因修改代码而产生bug。如果利用工厂模式的话不仅可以提高 代码的复用率,而且当需要修改代码时,只需要对工厂类和具体的实现类进行少量修改即可。


设计需求:消费链由产品--工厂--消费者三部分,现在消费者需要不同的食物。

分析需求:产品类提供不同的食物原材料,工厂类生产食物,消费者通过工厂类直接获取食物;

接下来分别用简单工厂模式、工厂方法模式和抽象工厂模式进行实现。

2、简单工厂模式:

 产品类:

/*
 * 简单工厂模式:这是产品的接口
 *
 */
public interface Food {
    
    public void foodName();

}

/*
 * 具体的产品:这是面包
 *
 */
public class Apple implements Food {

    @Override
    public void foodName() {
        System.out.println("----我是苹果-----");
    }

}

/*
 * 具体的产品:这是面包
 *
 */
public class Bread implements Food {

    @Override
    public void foodName() {
        System.out.println("----我是面包-----");
    }

}
工厂类:

/*
 * 工厂类:这是生产者
 *
 */
public class Factory {

    public static Food getFood(String foodName) {
        Food food = null;

        if ("bread".equals(foodName)) {
            food = new Bread();
        } else if ("apple".equals(foodName)) {
            food = new Apple();
        }

        return food;
    }

}
消费者类:

/*
 * 这是消费者类:这是消费者
 *
 */
public class Consumer {

    public static void main(String[] args) {

        System.out.println("这是简单工厂模式:");
        // 我想吃面包
        Food bread = Factory.getFood("bread");
        bread.foodName();

        // 我想吃苹果
        Food apple = Factory.getFood("apple");
        apple.foodName();
    }

}

输出结果:




3、工厂方法模式:

 产品类:

/*
 * 简单工厂模式:这是产品的接口
 *
 */
public interface Food {
    
    public void foodName();

}

/*
 * 具体的产品:这是面包
 *
 */
public class Apple implements Food {

    @Override
    public void foodName() {
        System.out.println("----我是苹果-----");
    }

}

/*
 * 具体的产品:这是面包
 *
 */
public class Bread implements Food {

    @Override
    public void foodName() {
        System.out.println("----我是面包-----");
    }

}
工厂类:

 
/*
 * 这是工厂接口:
 *
 */
public interface Factory {

    public Food getFood();

}

/*
 * 这是工厂类的具体实现:这是苹果工厂
 *
 */
public class AppleFactory implements Factory{

    @Override
    public Food getFood() {
        return new Apple();
    }

}

/*
 * 这是工厂类的具体实现:这是面包工厂
 *
 */
public class BreadFactory implements Factory{

    @Override
    public Food getFood() {
        return new Bread();
    }

}
消费者类:
 
/*
 * 这是消费者类:这是消费者
 *
 */
public class Consumer {

    public static void main(String[] args) {
        
        System.out.println("这是工厂方法模式:");
        // 我想吃面包
        Factory breadFactory=new BreadFactory();
        Food bread = breadFactory.getFood();
        bread.foodName();

        // 我想吃苹果
        Factory appleFactory=new AppleFactory();
        Food apple = appleFactory.getFood();
        apple.foodName();
    }

}

消费者类:


4、抽象工厂方法:

 增加需求:现在消费者需要食物的同时还需要饮料。

 产品类:

/*
 * 简单工厂模式:这是食物的接口
 *
 */
public interface Food {
    
    public void foodName();

}

/*
 * 具体的产品:这是面包
 *
 */
public class Apple implements Food {

    @Override
    public void foodName() {
        System.out.println("----我是苹果-----");
    }

}

/*
 * 具体的产品:这是面包
 *
 */
public class Bread implements Food {

    @Override
    public void foodName() {
        System.out.println("----我是面包-----");
    }

}

/*
 * 抽象工厂模式:这是饮料的接口
 *
 */
public interface Drink {

    public void drinkName();

}

/*
 *具体的产品:这是咖啡
 *
 */
public class Coffee implements Drink {

    @Override
    public void drinkName() {
        System.out.println("----我是咖啡----");
    }

}

/*
 *具体的产品:这是水
 *
 */
public class Water implements Drink {

    @Override
    public void drinkName() {
        System.out.println("----我是矿泉水----");
    }

}
工厂类:

/*
 * 这是工厂接口:
 *
 */
public interface Factory {
    // 获取食物
    public Food getFood();

    // 获取饮料
    public Drink getDrink();

}

/*
 * 这是工厂类的具体实现:这是苹果咖啡工厂
 *
 */
public class AppleCoffeeFactory implements Factory{

    @Override
    public Food getFood() {
        return new Apple();
    }

    @Override
    public Drink getDrink() {
        return new Coffee();
    }

}

/*
 * 这是工厂类的具体实现:这是面包水工厂
 *
 */
public class BreadWaterFactory implements Factory{

    @Override
    public Food getFood() {
        return new Bread();
    }

    @Override
    public Drink getDrink() {
        return new Water();
    }

}
消费者类:

/*
 * 这是消费者类:这是消费者
 *
 */
public class Consumer {

    public static void main(String[] args) {
        
        System.out.println("这是抽象工厂模式:");
        // 我想吃面包喝水
        BreadWaterFactory readWaterFactory=new BreadWaterFactory();
        Food bread = readWaterFactory.getFood();
        Drink water=readWaterFactory.getDrink();
        bread.foodName();
        water.drinkName();

        // 我想吃苹果喝咖啡
        AppleCoffeeFactory appleCoffeeFactory=new AppleCoffeeFactory();
        Food apple = appleCoffeeFactory.getFood();
        Drink coffe=appleCoffeeFactory.getDrink();
        apple.foodName();
        coffe.drinkName();
    }

}
输出结果:





 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值