设计模式--工厂模式

简单工厂模式学习

package com.factory;

//产品接口
public interface Product {
    void craftwork(); //制作工艺
    void type(); //产品特征
}
package com.factory;

//鲜奶实现类
public class Creamery implements Product {

    @Override
    public void craftwork() {
        System.out.println("实现类制作工艺:牛奶+除菌=鲜奶");
    }

    @Override
    public void type() {
        System.out.println("实现类产品特征:原味浓香");
    }

}
package com.factory;

//酸奶实现类
public class Yoghourt implements Product {

    @Override
    public void craftwork() {
        System.out.println("实现类制作工艺:牛奶+酵母菌+糖=酸奶");
    }

    @Override
    public void type() {
        System.out.println("实现类产品特征:酸甜可口");
    }

}
package com.factory;
//自定义异常
public class BadException extends Exception {

    public BadException(String msg){
        super(msg);
    }
}
package com.factory;
//静态工厂方法
public class StaticFactory {
    public static Product factory(String str) throws BadException{
        if(str.equalsIgnoreCase("yoghourt")){
            System.out.println("静态工厂:生产酸奶");
            return new Yoghourt();
        }else
        if(str.equalsIgnoreCase("creamery")){
            System.out.println("静态工厂:生产鲜奶");
            return new Creamery();
        }else{
            throw new BadException("没有该类型产品!");
        }
    }
}

测试代码:

package com.factory;
//测试类
public class Test {

    public static void main(String[] args) {
        try {
            Product y = StaticFactory.factory("Yoghourt");
            y.craftwork();
            y.type();
            Product c = StaticFactory.factory("Creamery");
            c.craftwork();
            c.type();
        } catch (BadException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

执行结果:

静态工厂:生产酸奶
实现类制作工艺:牛奶+酵母菌+糖=酸奶
实现类产品特征:酸甜可口
静态工厂:生产鲜奶
实现类制作工艺:牛奶+除菌=鲜奶
实现类产品特征:原味浓香

总结:

1、静态工厂决定哪一个产品类应当被实例化

产品接口: 产品类1,产品类2,产品类3实现产品接口

工厂类:如果有新的产品类添加,添加判断逻辑,依据逻辑进行产品类的实例化

2、对开闭原则支持不够

要修改工厂类

工厂方法模式:

1、克服了简单工厂模式的缺点

2、工厂类不再负责所有的产品的创建,仅负责给出具体工厂子类必须实现的接口

3、不接触哪个产品应该被实例化,只给出具体工厂子类必须实现的接口

4、新增加产品的时候,不需要修改产品类和工厂接口类,只需要添加一个新的产品类,增加一个生产该产品的工厂即可

5、遵循开闭原则,对扩展开放,对修改关闭

package com.factorymethod;
//产品工厂接口
public interface ProductFactory {
    Product factory();
}
package com.factorymethod;

public class CreameryFactory implements ProductFactory {

    @Override
    public Product factory() {
        System.out.println("鲜奶工厂类:生产鲜奶");
        return new Creamery();
    }
}
package com.factorymethod;

public class YoghourtFactory implements ProductFactory {

    @Override
    public Product factory() {
        System.out.println("酸奶工厂类:生产酸奶");
        return new Yoghourt();
    }

}

测试类:

package com.factorymethod;
//测试类
public class Test {

    public static void main(String[] args) {
        Product y = new YoghourtFactory().factory();
        y.craftwork();
        y.type();
        Product c = new CreameryFactory().factory();
        c.craftwork();
        c.type();
    }
}

执行结果:

酸奶工厂类:生产酸奶
实现类制作工艺:牛奶+酵母菌+糖=酸奶
实现类产品特征:酸甜可口
鲜奶工厂类:生产鲜奶
实现类制作工艺:牛奶+除菌=鲜奶
实现类产品特征:原味浓香

原文地址:https://www.cnblogs.com/nikey/p/6437815.html