4.工厂模式

4.工厂模式

简单工厂

类图

简单工厂

优缺点

  1. 优点

    简单,解耦。
    
  2. 缺点

    当需要扩充业务时,需要对BaoziFactory进行修改,当废弃某一产品时,也需要修改factory代码,产品过多,可能导致factory代码过长,冗余度高。
    

code

package com.desmond.codebase.designpattern.facotry.simple;

/**
 * 包子.
 * @author presleyli
 * @date 2018/9/18 下午7:35
 */
public interface Baozi {
    void sayHello();
}

package com.desmond.codebase.designpattern.facotry.simple;

/**
 * @author presleyli
 * @date 2018/9/18 下午7:40
 */
public class BeefBaozi implements Baozi {
    @Override
    public void sayHello() {
        System.out.println("I'm beef baozi.");
    }
}

package com.desmond.codebase.designpattern.facotry.simple;

/**
 * @author presleyli
 * @date 2018/9/18 下午7:40
 */
public class PorkBaozi implements Baozi {
    @Override
    public void sayHello() {
        System.out.println("I'm pork baozi.");
    }
}

package com.desmond.codebase.designpattern.facotry.simple;

/**
 * @author presleyli
 * @date 2018/9/18 下午7:41
 */
public class BaoziFactory {
    public static Baozi getBaozi(String name) {
        switch (name) {
            case "beef":
                return new BeefBaozi();
            case "pork":
                return new PorkBaozi();
        }

        return null;
    }
}

package com.desmond.codebase.designpattern.facotry.simple;

/**
 * 如果需要添加其他种类的baozi,
 * 需要修改baoziFactory,
 * 如果要废掉某些baozi,比较麻烦.
 * @author presleyli
 * @date 2018/9/18 下午7:50
 */
public class Test {
    public static void main(String[] args) {
        Baozi baozi = BaoziFactory.getBaozi("beef");
        baozi.sayHello();
    }
}

输出

I'm beef baozi.

工厂方法

类图

工厂方法

优缺点

  1. 优点

    解耦,符合开闭原则,新增业务时,只需要扩展代码即可.
    
  2. 缺点

    稍微有些复杂,新增业务时,需要实现 产品+工厂 两个子类,对应扩充大量业务,需要的类也比较多,一个工厂只生产单一产品,有些浪费
    

code

package com.desmond.codebase.designpattern.facotry.factory;

/**
 * 包子.
 * @author presleyli
 * @date 2018/9/18 下午7:35
 */
public interface Baozi {
    void sayHello();
}

package com.desmond.codebase.designpattern.facotry.factory;

/**
 * @author presleyli
 * @date 2018/9/18 下午7:40
 */
public class BeefBaozi implements Baozi {
    @Override
    public void sayHello() {
        System.out.println("I'm beef baozi.");
    }
}

package com.desmond.codebase.designpattern.facotry.factory;

/**
 * @author presleyli
 * @date 2018/9/18 下午7:40
 */
public class PorkBaozi implements Baozi {
    @Override
    public void sayHello() {
        System.out.println("I'm pork baozi.");
    }
}

package com.desmond.codebase.designpattern.facotry.factory;

/**
 * Created by presleyli on 2018/9/18.
 */
public interface BaoziFactory {
    Baozi createBaozi();
}

package com.desmond.codebase.designpattern.facotry.factory;

/**
 * @author presleyli
 * @date 2018/9/18 下午8:52
 */
public class BeefBaoziFactory implements BaoziFactory{
    @Override
    public Baozi createBaozi() {
        return new BeefBaozi();
    }
}

package com.desmond.codebase.designpattern.facotry.factory;

/**
 * @author presleyli
 * @date 2018/9/18 下午8:53
 */
public class PorkBaoziFactory implements BaoziFactory {
    @Override
    public Baozi createBaozi() {
        return new PorkBaozi();
    }
}

package com.desmond.codebase.designpattern.facotry.factory;

/**
 * @author presleyli
 * @date 2018/9/18 下午8:53
 */
public class Test {
    public static void main(String[] args) {
        BaoziFactory baoziFactory = new BeefBaoziFactory();
        Baozi baozi = baoziFactory.createBaozi();

        baozi.sayHello();

        baoziFactory = new PorkBaoziFactory();
        baozi = baoziFactory.createBaozi();

        baozi.sayHello();
    }
}

输出

I'm beef baozi.
I'm pork baozi.
    

抽象工厂

类图

抽象工厂

优缺点

  1. 优点

    对工厂方法进一步抽象,可以针对某一产品族进行抽象,比如 工厂A, 既可以生产 牛肉、卷芯菜的包子,而非单一牛肉馅得包子
    
  2. 缺点

    复杂度高,目前我还未用到此类模式
    

code

package com.desmond.codebase.designpattern.facotry.abstract_factory;

/**
 * Created by presleyli on 2018/9/18.
 */
public interface Meet {
    String getName();
}

package com.desmond.codebase.designpattern.facotry.abstract_factory;

/**
 * @author presleyli
 * @date 2018/9/18 下午9:51
 */
public class Pork implements Meet{
    @Override
    public String getName() {
        String name = "I'm pork...";

        System.out.println(name);

        return name;
    }
}

package com.desmond.codebase.designpattern.facotry.abstract_factory;

/**
 * @author presleyli
 * @date 2018/9/18 下午9:51
 */
public class Beef implements Meet{
    @Override
    public String getName() {
        String name = "I'm beef...";

        System.out.println(name);

        return name;
    }
}

package com.desmond.codebase.designpattern.facotry.abstract_factory;

/**
 * Created by presleyli on 2018/9/18.
 */
public interface Vegetables {
    String getName();
}

package com.desmond.codebase.designpattern.facotry.abstract_factory;

/**
 * @author presleyli
 * @date 2018/9/18 下午9:52
 */
public class Cabbage implements Vegetables{
    @Override
    public String getName() {
        String name = "I'm cabbage...";

        System.out.println(name);

        return name;
    }
}

package com.desmond.codebase.designpattern.facotry.abstract_factory;

/**
 * @author presleyli
 * @date 2018/9/18 下午9:52
 */
public class GreenPepper implements Vegetables{
    @Override
    public String getName() {
        String name = "I'm green pepper...";

        System.out.println(name);

        return name;
    }
}

package com.desmond.codebase.designpattern.facotry.abstract_factory;

/**
 * Created by presleyli on 2018/9/18.
 */
public interface IntegrationCreator {
    Meet getMeet();
    Vegetables getVegetables();
}

package com.desmond.codebase.designpattern.facotry.abstract_factory;

/**
 * @author presleyli
 * @date 2018/9/18 下午9:56
 */
public class InterationCreator1 implements IntegrationCreator{
    @Override
    public Meet getMeet() {
        return new Pork();
    }

    @Override
    public Vegetables getVegetables() {
        return new Cabbage();
    }
}

package com.desmond.codebase.designpattern.facotry.abstract_factory;

/**
 * @author presleyli
 * @date 2018/9/18 下午9:56
 */
public class InterationCreator2 implements IntegrationCreator{
    @Override
    public Meet getMeet() {
        return new Pork();
    }

    @Override
    public Vegetables getVegetables() {
        return new GreenPepper();
    }
}

package com.desmond.codebase.designpattern.facotry.abstract_factory;

/**
 * @author presleyli
 * @date 2018/9/18 下午9:56
 */
public class InterationCreator3 implements IntegrationCreator{
    @Override
    public Meet getMeet() {
        return new Beef();
    }

    @Override
    public Vegetables getVegetables() {
        return new GreenPepper();
    }
}

package com.desmond.codebase.designpattern.facotry.abstract_factory;

import lombok.Data;

/**
 * @author presleyli
 * @date 2018/9/18 下午9:54
 */
public class Baozi {
    private Vegetables vegetables;
    private Meet meet;

    private IntegrationCreator creator;

    public Baozi() {
    }

    public Baozi(IntegrationCreator creator) {
        this.creator = creator;
    }

    public void prepare() {
        System.out.println("preparing...");

        this.vegetables = creator.getVegetables();
        this.meet = creator.getMeet();
    }

    public void makeBaozi() {
        System.out.println("starting to making bao zi...");
        this.vegetables.getName();
        this.meet.getName();
    }

    public Vegetables getVegetables() {
        return vegetables;
    }

    public void setVegetables(Vegetables vegetables) {
        this.vegetables = vegetables;
    }

    public Meet getMeet() {
        return meet;
    }

    public void setMeet(Meet meet) {
        this.meet = meet;
    }

    public IntegrationCreator getCreator() {
        return creator;
    }

    public void setCreator(IntegrationCreator creator) {
        this.creator = creator;
    }
}

package com.desmond.codebase.designpattern.facotry.abstract_factory;

/**
 * @author presleyli
 * @date 2018/9/18 下午9:57
 */
public class Test {
    public static void main(String[] args) {
        Baozi baozi = new Baozi();
        baozi.setCreator(new InterationCreator1());

        baozi.prepare();
        baozi.makeBaozi();

        // 2nd
        System.out.println("2nd");

        baozi.setCreator(new InterationCreator2());

        baozi.prepare();
        baozi.makeBaozi();

        // 3rd
        System.out.println("3rd");
        baozi.setCreator(new InterationCreator3());

        baozi.prepare();
        baozi.makeBaozi();
    }
}

输出

preparing...
starting to making bao zi...
I'm cabbage...
I'm pork...
2nd
preparing...
starting to making bao zi...
I'm green pepper...
I'm pork...
3rd
preparing...
starting to making bao zi...
I'm green pepper...
I'm beef...

猜你喜欢

转载自blog.csdn.net/firemaple_li/article/details/82765233