工厂模式

如何使用工厂模式

工厂模式可以分成三类:

  • 简单/静态工厂模式
  • 工厂方法模式
  • 抽象工厂模式

1.1工厂方法模式

下面以一个什么水果都有的水果店举例子

package com.cat.factory;

/**
 * 什么水果都有的水果店(工厂)
 */
public interface FruitFactory {

    //可以获取任何水果的方法
    Fruit createFurit();
}

构建苹果和梨的工厂(继承着所有水果的工厂)

/**
 * 苹果工厂继承水果工厂
 */
public class AppleFactory implements FruitFactory {

    /**
     * 创建水果
     * @return
     */
    @Override
    public Fruit createFruit(){
        return new Apple();
    }
}
/**
 * 梨工厂继承水果工厂
 */
public class PearFactory implements FruitFactory {

    /**
     * 创建梨
     * @return
     */
    @Override
    public Fruit createFruit() {
        return new Pear();
    }
}

还有我们的实体类:苹果、梨、水果(多态:苹果和梨都是水果,可以直接用水果来表示)

/**
 * 水果抽象类
 */
public abstract class Fruit {

    // 所有水果都有颜色-抽象方法
    public abstract void color();
}
/**
 * 苹果
 */
public class Apple  extends Fruit {

    @Override
    public void color() {
        System.out.println("苹果是红色的");
    }
}
/**
 * 梨
 */
public class Pear extends Fruit {

    @Override
    public void color() {
        System.out.println("梨是黄色的");
    }
}

那么现在我想要买一个苹果,我就跟水果店老板说,老板就给我拿来苹果了,如下:

public class TestFruit {

    public static void main(String[] args) {
        //去苹果工厂找了一个苹果
        FruitFactory f = new AppleFactory();
        //老板就拿了一个苹果给客人
        Fruit fruit = f.createFruit();
        //苹果的颜色
        fruit.color();
    }
}

优点:

  • 1:客户端不需要在负责对象的创建,明确了各个类的职责
  • 2:如果有新的对象增加,只需要增加一个具体的类和具体的工厂类即可
  • 3:不会影响已有的代码,后期维护容易,增强系统的扩展性

缺点:

  • 1:需要额外的编写代码,增加了工作量

1.2简单/静态工厂模式

现在水果店生意不好做啊,很多水果都卖不出去了,于是老板只卖苹果和梨两种水果了。

  • 既然就只有两种水果的话,那就没必要有”苹果厂“、”梨厂“了,一个(苹果+梨)厂就行了!

所以我们的工厂是这样子的:

/**
 * 一个即可创建苹果又可创建梨的简单工厂
 */
public class SimpleFruitFactory {


    public static Apple createApple(){
        return new Apple();
    }

    public static Pear createPear(){
        return new Pear();
    }

    /**
     * 如果外界(客人)想要苹果、梨,直接在这里创建就行了
     */
    public static Fruit createFruit(String type){
        if("apple".equals(type)){
            return createApple();
        }else if("pear".equals(type)){
            return createPear();
        }else{
            return null;
        }
    }
}

获取苹果,梨:

public class TestFruit {

    public static void main(String[] args) {
        //苹果
        Fruit apple = SimpleFruitFactory.createApple();
        apple.color();
        //
        Fruit pear = SimpleFruitFactory.createPear();
        pear.color();
    }
}

现在问题来了:

  • 1:我想要一个西瓜,可是我的工厂类没有西瓜
  • 2:我就去改代码,写可以创建西瓜对象的
  • 3:接着,我又要其他的水果
  • 4:我还是得改代码
  • 5...................
  • 6:这就是简单工厂类的缺点:当需求改变了,我就要改代码.

简单工厂类的优点也很明显:我就一个具体的工厂来创建对象,代码量少。

1.3抽象工厂模式

抽象工厂模式就比较复杂了,我们一般的应用都写不到。我首先来简述一下需求吧:

  • 每一种水果都有它的价格

    • 有的人买贵的
    • 有的人买便宜的

那我们的苹果和梨都是有价格的,不是贵的就是便宜的~~

  • 我们之前在工厂方法模式下是每种水果都开一个工厂,如果水果过多的话,那么就有很多的工厂~
  • 那现在我们可以抽取出来:每个水果不是贵的就是便宜~
  • 所以我们有两个工厂就足够了!

具体的代码是这样的:

我们的最大工厂还是定义了创建什么水果

(待续)

posted @ 2020-06-15 23:09  会偷袭的猫  阅读(128)  评论(0编辑  收藏  举报