java设计模式(二)——工厂模式

1、基本概念

工厂模式属于创造型模式,对象不再用户去调用,而是交由工厂去创建。

例如:我们想要吃烤鸭,如果自己做的话,那么需要买鸭,处理鸭,烤,放作料等一些列过程。

而如果我们去餐厅去买的话,我们就不需要关心怎么去做的,由饭店给我们做,它给我们做好的鸭子即可。

 

2、工厂类型

工厂模式属于创造型的模式,三种形式:简单工厂,工厂方法,抽象工厂,

 每种工厂都有它的优缺点,看合适的场景去使用。

2.1、简单工厂

适用于创建对象少,不经常变,用户无需在意对象的创建过程,简单容易理解。

案例:

 类图:

 接口:Icource

/**
 * @date 2020/6/30
 */
public interface Icource {

    //备课
    void prepareCource();

    //教学
    void teach();

    //批改作业
    void correctiveWork();

}

实现类:MathCource 

/**
 * @date 2020/6/30
 */
public class MathCource implements Icource {
    @Override
    public void prepareCource() {
        System.out.println("备数学课");
    }

    @Override
    public void teach() {
        System.out.println("数学教学");
    }

    @Override
    public void correctiveWork() {
        System.out.println("批改数学作业");
    }
}

实现类:EnglishCource 

/**
 * @date 2020/6/30
 */
public class EnglishCource implements Icource {
    @Override
    public void prepareCource() {
        System.out.println("备英语课");
    }

    @Override
    public void teach() {
        System.out.println("英语教学");
    }

    @Override
    public void correctiveWork() {
        System.out.println("批改英语作业");
    }
}

简单工厂:

/**
 * @date 2020/6/30
 */
public class CourceSimpleFactory {

    public  static Icource  createCource(String  type){
        Icource icource = null;
        if("math".equals(type)){
            icource = new MathCource();
        }else if("english".equals(type)){
            icource = new EnglishCource();
        }
        return icource;
    }
}

测试类:

/**
 * @date 2020/6/30
 */
public class Test {
    public static void main(String[] args) {
        Icource icource = CourceSimpleFactory.createCource("math");
        icource.prepareCource();
        icource.teach();
        icource.correctiveWork();
    }
}

 

2.2、工厂方法

上面的简单工厂虽然用法简单,但不利于扩展。当我们新增一个语文课时,我们需要修改简单工厂的代码,这不符合开闭原则,而且当

简单工厂创建的对象经常改变,种类繁多时,也就不符合单一职责。这时候工厂方法就有了,它符合开闭原则,职能单一原则。

创建的对象多,让系统代码结构更为复杂。

案例:

类图:

 

 

 

课程接口Icource :

/**
 * @date 2020/6/30
 */
public interface Icource {

    //备课
    void prepareCource();

    //教学
    void teach();

    //批改作业
    void correctiveWork();

}

实现类MathCource :

/**
 * @date 2020/6/30
 */
public class MathCource implements Icource {
    @Override
    public void prepareCource() {
        System.out.println("备数学课");
    }

    @Override
    public void teach() {
        System.out.println("数学教学");
    }

    @Override
    public void correctiveWork() {
        System.out.println("批改数学作业");
    }
}

实现类EnglishCource :

/**
 * @date 2020/6/30
 */
public class EnglishCource implements Icource {
    @Override
    public void prepareCource() {
        System.out.println("备英语课");
    }

    @Override
    public void teach() {
        System.out.println("英语教学");
    }

    @Override
    public void correctiveWork() {
        System.out.println("批改英语作业");
    }
}

工厂接口IcourceFactory :

/**
 * @date 2020/6/30
 */
public interface IcourceFactory {

    Icource createInstance();

}

实现工厂接口类EnglishFactory  :

/**
 * @date 2020/6/30
 */
public class EnglishFactory  implements IcourceFactory{

    @Override
    public Icource createInstance() {
        return new EnglishCource();
    }
}

实现工厂接口类:MathFacotry 

/**
 * @date 2020/6/30
 */
public class MathFacotry implements IcourceFactory {

    @Override
    public Icource createInstance() {
        return new MathCource();
    }
}

测试类:

/**
 * @date 2020/6/30
 */
public class Test {
    public static void main(String[] args) {
        IcourceFactory icourceFactory = new EnglishFactory();
        Icource instance = icourceFactory.createInstance();
        instance.correctiveWork();
    }
}

 

2.3、抽象工厂

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类,适用于产品族

缺点:结构较复杂,理解难度大,当工厂新增一个产品时,需要修改工厂的方法,不符合开闭原则。

案例:现有三个工厂类:小米工厂,格力工厂,美的工厂

小米工厂:生产空调,洗衣机,榨汁机,这三个就可以是一个产品族了

格力工厂:生产空调,洗衣机,榨汁机

美的工厂:生产空调,洗衣机,榨汁机

抽象工厂:定义三个抽象方法

类图:

 

 

 抽象工厂AbstractFactory :

/**
 * @date 2020/6/30
 */
public abstract class AbstractFactory {

    protected  abstract  IAirConditioning createAirConditioning();

    protected  abstract  IJuicer createJuicer();

    protected  abstract  IWashingMachine createWashingMachine();
}

抽象工厂继承类XiaomiFactory :

/**
 * @date 2020/6/30
 */
public class XiaomiFactory extends AbstractFactory {
    @Override
    protected IAirConditioning createAirConditioning() {
        return new XiaomiAirConditioning();
    }

    @Override
    protected IJuicer createJuicer() {
        return new XiaomiJuicer();
    }

    @Override
    protected IWashingMachine createWashingMachine() {
        return new XiaomiWashingMachine();
    }
}

 

抽象工厂继承类MideaFactory:

/**
 * @date 2020/6/30
 */
public class MideaFactory extends AbstractFactory {
    @Override
    protected IAirConditioning createAirConditioning() {
        return new MideaAirConditioning();
    }

    @Override
    protected IJuicer createJuicer() {
        return new MideaJuicer();
    }

    @Override
    protected IWashingMachine createWashingMachine() {
        return new MideaWashingMachine();
    }
}

 

抽象工厂继承类GreenFactory:

/**
 * @date 2020/6/30
 */
public class GreenFactory extends AbstractFactory {
    @Override
    protected IAirConditioning createAirConditioning() {
        return new GreenAirConditioning();
    }

    @Override
    protected IJuicer createJuicer() {
        return new GreenJuicer();
    }

    @Override
    protected IWashingMachine createWashingMachine() {
        return new GreenWashingMachine();
    }
}

 

空调接口IAirConditioning :

/**
 * @date 2020/6/30
 */
public interface IAirConditioning {

    void  refrigeration();


}

其实现类XiaomiAirConditioning :

/**
 * @date 2020/6/30
 */
public class XiaomiAirConditioning implements IAirConditioning {
    @Override
    public void refrigeration() {
        System.out.println("小米空调");
    }
}

其实现类MideaAirConditioning :

/**
 * @date 2020/6/30
 */
public class MideaAirConditioning implements IAirConditioning {
    @Override
    public void refrigeration() {
        System.out.println("美的空调");
    }
}

其实现类GreenAirConditioning :

/**
 * @date 2020/6/30
 */
public class GreenAirConditioning implements IAirConditioning {
    @Override
    public void refrigeration() {
        System.out.println("格力空调");
    }
}

洗衣机接口IWashingMachine :

/**
 * @date 2020/6/30
 */
public interface IWashingMachine {

    void washClothes();
}

其实现类XiaomiWashingMachine :

/**
 * @date 2020/6/30
 */
public class XiaomiWashingMachine implements IWashingMachine {
    @Override
    public void washClothes() {
        System.out.println("小米洗衣机");
    }
}

其实现类MideaWashingMachine :

/**
 * @date 2020/6/30
 */
public class MideaWashingMachine implements IWashingMachine {
    @Override
    public void washClothes() {
        System.out.println("美的洗衣机");
    }
}

其实现类GreenWashingMachine :

/**
 * @date 2020/6/30
 */
public class GreenWashingMachine implements IWashingMachine {
    @Override
    public void washClothes() {
        System.out.println("格力洗衣机");
    }
}

榨汁机接口IJuicer :

/**
 * @date 2020/6/30
 */
public interface IJuicer {

    void juicing();
}

其实现类XiaomiJuicer :

/**
 * @date 2020/6/30
 */
public class XiaomiJuicer implements IJuicer {
    @Override
    public void juicing() {
        System.out.println("小米榨汁机");
    }
}

其实现类MideaJuicer :

/**
 * @date 2020/6/30
 */
public class MideaJuicer implements IJuicer {
    @Override
    public void juicing() {
        System.out.println("美的空调");
    }
}

其实现类MideaJuicer :

/**
 * @date 2020/6/30
 */
public class GreenJuicer implements IJuicer {
    @Override
    public void juicing() {
        System.out.println("格力榨汁机");
    }
}

其实现类GreenJuicer :

/**
 * @date 2020/6/30
 */
public class GreenJuicer implements IJuicer {
    @Override
    public void juicing() {
        System.out.println("格力榨汁机");
    }
}

测试类:

/**
 * @date 2020/6/30
 */
public class Test {
    public static void main(String[] args) {
        AbstractFactory factory = new GreenFactory();
        factory.createAirConditioning().refrigeration();
    }
}

 

posted @ 2020-07-01 22:27  来一杯可乐  阅读(275)  评论(0编辑  收藏  举报