设计模式<第一篇>:工厂模式

2020-05-10  本文已影响0人  NoBugException

工厂模式在程序设计中是经常用到的一个设计模式,它可以将系统的构建过程和使用过程解耦。

工厂模式分为三种:

(1)简单工厂模式
(2)工厂方法模式
(3)抽象工厂模式

(1)简单工厂模式
图片.png

场景:制作戴尔鼠标和惠普鼠标

分析:
(1)戴尔鼠标和惠普鼠标都是鼠标,其中都有“制作”这个行为;
(2)为了方便生产,来一个工厂统一制造这两种品牌鼠标;

定义一个鼠标接口,声明两种鼠标共同的行为doOption

public interface Mouse {

    public void doOption();

}

创建戴尔鼠标对象,并实现“制造”行为

public class DellMouse implements Mouse {

    @Override
    public void doOption() {
        System.out.println("制作戴尔鼠标");
    }
}

创建惠普鼠标对象,并实现“制造”行为

public class HpMouse implements Mouse{

    @Override
    public void doOption() {
        System.out.println("制作惠普鼠标");
    }
}

创建一个工厂,统一管理这两种鼠标

public class MouseFactory {

    private static Mouse mouse;

    /**
     *  简单工厂模式
     * @param flag 0:戴尔鼠标 1:惠普鼠标
     * @return
     */
    public static Mouse createMouse(int flag){
        switch (flag){
            case 0:
                mouse = new DellMouse();
                break;
            case 1:
                mouse = new HpMouse();
                break;
        }
        return mouse;
    }
}

使用

    Mouse mouse1 = MouseFactory.createMouse(0);
    mouse1.doOption();
    Mouse mouse2 = MouseFactory.createMouse(1);
    mouse2.doOption();

以上就是简单工厂模式了。

缺点:生产哪种鼠标由参数决定, 在使用的时候,参数的意义不明确,使用困难。

个人理解:虽然简单工厂模式有缺陷,但是如果需要区分的参数不是太多,并且添加注释说面每个参数的意思也是可以这样写的。

(2)工厂方法模式
图片.png

场景:和(1)类似, 也是生产两种不同品牌的鼠标。

分析:为了解决(1)中“参数的意义不明确”的弊端,可以将工厂分离,即工厂A专门生产戴尔鼠标,工厂B专门生产惠普鼠标。

定义一个鼠标接口,声明两种鼠标共同的行为doOption

public interface Mouse {

    public void doOption();

}

创建戴尔鼠标对象,并实现“制造”行为

public class DellMouse implements Mouse {

    @Override
    public void doOption() {
        System.out.println("制作戴尔鼠标");
    }
}

创建惠普鼠标对象,并实现“制造”行为

public class HpMouse implements Mouse{

    @Override
    public void doOption() {
        System.out.println("制作惠普鼠标");
    }
}

定义一个专门生产戴尔鼠标的工厂

public class DellMouseFactory implements MouseFactory {
    @Override
    public Mouse createMouse() {
        return new DellMouse();
    }
}

定义一个专门生产惠普鼠标的工厂

public class HpMouseFactroy implements MouseFactory {
    @Override
    public Mouse createMouse() {
        return new HpMouse();
    }
}

使用

//工厂模式(生产哪种鼠标由对象决定)
Mouse mouse1 = new DellMouseFactory().createMouse();
mouse1.doOption();
Mouse mouse2 = new HpMouseFactroy().createMouse();
mouse2.doOption();

优点:
(1)避免了简单工厂模式参数不清晰的问题;
(2)生产哪种品牌的鼠标由工厂对象决定;

(3)抽象工厂模式
图片.png

说明:
(1)当抽象工厂模式的产品只有一个的时候,即变成工厂模式;
(2)当工厂模式的产品变成多个时,即变成抽象工厂模式;

场景:有两个工厂,分别是戴尔工厂和惠普工厂,戴尔工厂生产对应品牌的鼠标和键盘,惠普工厂也生产对应品牌的鼠标和键盘;

定义一个鼠标接口,声明两种鼠标共同的行为doOption

public interface Mouse {

    public void doOption();

}

创建戴尔鼠标对象,并实现“制造”行为

public class DellMouse implements Mouse {

    @Override
    public void doOption() {
        System.out.println("制作戴尔鼠标");
    }
}

创建惠普鼠标对象,并实现“制造”行为

public class HpMouse implements Mouse{

    @Override
    public void doOption() {
        System.out.println("制作惠普鼠标");
    }
}

定义一个键盘接口,声明两种鼠标共同的行为sayHi

public interface KeyBoard {
    void sayHi();
}

创建戴尔键盘对象,并实现其行为

public class DellKeyBoard implements KeyBoard{
    @Override
    public void sayHi() {
        System.out.println("我是戴尔键盘");
    }
}

创建惠普键盘对象,并实现其行为

public class HpKeyBoard implements KeyBoard {
    @Override
    public void sayHi() {
        System.out.println("我是惠普键盘");
    }
}

定义一个戴尔工厂,用来生产对应品牌的鼠标和键盘

public class DellFactory implements PcFactory {

    @Override
    public Mouse createMouse() {
        return new DellMouse();
    }

    @Override
    public KeyBoard createKeyBoard() {
        return new DellKeyBoard();
    }
}

定义一个惠普工厂,用来生产对应品牌的鼠标和键盘

public class HpFactory implements PcFactory {
    @Override
    public Mouse createMouse() {
        return new HpMouse();
    }

    @Override
    public KeyBoard createKeyBoard() {
        return new HpKeyBoard();
    }
}

使用

Mouse mouse5 = new DellFactory().createMouse();
mouse5.doOption();
KeyBoard keyBoard1 = new DellFactory().createKeyBoard();
keyBoard1.sayHi();
Mouse mouse6 = new HpFactory().createMouse();
mouse6.doOption();
KeyBoard keyBoard2 = new HpFactory().createKeyBoard();
keyBoard2.sayHi();
总结:

(1)简单工厂模式,还是真的简单,用一个杂牌工厂类生产多个杂牌产品,在使用该模式的时候,需要传递一个参数,这个参数用来区分不同的产品;
(2)工厂模式(工厂方法模式),用多个工厂分别生产不同品牌的单个产品;
(3)抽象工厂模式,用多个工厂分别生产不同品牌的多个产品;

[本章完...]

上一篇 下一篇

猜你喜欢

热点阅读