抽象工厂模式

前面的工厂模式出现一个情况,工厂只能生产一种类别的产品(比如键盘)

如果工厂要既能生产鼠标,又能生产键盘呢?如果需要有多个工厂,都能生产鼠标和键盘呢?这就用到了我们的抽象工厂模式。

 

工厂方法模式和抽象工厂模式不好分清楚,它们的区别如下:
工厂方法模式:
一个抽象产品类,可以派生出多个具体类
一个抽象工厂类,可以派生出多个具体类
每个具体工厂类智能创建一个具体产品类的实例
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类
一个抽象工厂类,可以派生出多个具体工厂类
每个具体工厂类可以创建多个具体产品类的实例,也就是创建的是一个产品线下的多个产品

例子:

 

   工厂是电脑工厂,能生产鼠标和键盘

   工厂又分别为罗技工厂和微软工厂,两个工厂生产的鼠标和键盘是分别两个厂商的

代码:

package com.zhen.build_template.abstract_factory;

/**
 * @author zhen
 * @Date 2019/5/28 12:48
 */
public interface PCFactory {
    Mouse getMouseInstance();

    KeyBoard getKeyBoardInstance();
}

package com.zhen.build_template.abstract_factory;

/**
 * @author zhen
 * @Date 2019/5/28 12:49
 */
public class LuoJiPCFactory implements PCFactory {
    @Override
    public Mouse getMouseInstance() {
        return new LuoJiMouse();
    }

    @Override
    public KeyBoard getKeyBoardInstance() {
        return new LuoJiKeyBoard();
    }
}

package com.zhen.build_template.abstract_factory;

/**
 * @author zhen
 * @Date 2019/5/28 12:50
 */
public class MicrosoftPCFactory implements PCFactory {
    @Override
    public Mouse getMouseInstance() {
        return new MicroSoftMouse();
    }

    @Override
    public KeyBoard getKeyBoardInstance() {
        return new MicroSoftKeyBoard();
    }
}

package com.zhen.build_template.abstract_factory;

/**
 * @author zhen
 * @Date 2019/5/28 11:45
 */
public abstract class Mouse {
    public abstract void click();
}

package com.zhen.build_template.abstract_factory;

/**
 * @author zhen
 * @Date 2019/5/28 12:43
 */
public class LuoJiMouse extends Mouse{
    @Override
    public void click() {
        System.out.println("罗技鼠标点击");
    }
}

package com.zhen.build_template.abstract_factory;

/**
 * @author zhen
 * @Date 2019/5/28 12:44
 */
public class MicroSoftMouse extends Mouse {
    @Override
    public void click() {
        System.out.println("微软鼠标宏");
    }
}


package com.zhen.build_template.abstract_factory;

/**
 * @author zhen
 * @Date 2019/5/28 11:45
 */
public abstract class KeyBoard {
    public abstract void press();
}

package com.zhen.build_template.abstract_factory;

/**
 * @author zhen
 * @Date 2019/5/28 12:40
 */
public class LuoJiKeyBoard extends KeyBoard {
    @Override
    public void press() {
        System.out.println("罗技键盘触感");
    }
}


package com.zhen.build_template.abstract_factory;



/**
 * @author zhen
 * @Date 2019/5/28 12:41
 */
public class MicroSoftKeyBoard extends KeyBoard {
    @Override
    public void press() {
        System.out.println("微软式触感");
    }
}
View Code

 

posted @ 2019-05-29 10:51  guodaxia  阅读(180)  评论(0编辑  收藏  举报