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

简单工厂模式

        简单工厂模式又叫做静态工厂方法模式(static Factory Method pattern),它是通过使用静态方法接收不同的参数来返回不同的实例对象(这些产品类继承自一个父类或接口)。

       简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式

工厂(Creator)角色

简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。

抽象产品(Product)角色

简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

具体产品(Concrete Product)角色

是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。

 代码展示

interface IKeyboard{
    void inPrint();
    void outPrint();
}
class DelKeyboard implements IKeyboard{
    @Override
    public void inPrint() {
        System.out.println("使用功戴尔的键盘输入");
    }
    @Override
    public void outPrint() {
        System.out.println("使用功戴尔的键盘输出");
    }
}
class HPKeyboard implements IKeyboard{
    @Override
    public void inPrint() {
        System.out.println("使用惠普的键盘输入");
    }
    @Override
    public void outPrint() {
        System.out.println("使用惠普的键盘输出");
    }
}
class LenovoKeyboard implements IKeyboard{
    @Override
    public void inPrint() {
        System.out.println("使用联想的键盘输入");
    }
    @Override
    public void outPrint() {
        System.out.println("使用联想的键盘输出");
    }
}
class IKeyboardFactory{
    public static IKeyboard createKeyboard(String brand){
        IKeyboard keyboard = null;
        switch (brand){
            case "HP":
                keyboard = new HPKeyboard();
                break;
            case "Lenovo":
                keyboard = new LenovoKeyboard();
                break;
            case "Del":
                keyboard = new DelKeyboard();
                break;
        }
        return keyboard;
    }
}
public class SimpleFactory {
    public static void main(String[] args) {
        IKeyboard hp = IKeyboardFactory.createKeyboard("HP");
        hp.inPrint();//使用惠普的键盘输入
        hp.outPrint();//使用惠普的键盘输出
    }
}

 工厂方法模式

工厂模式是简单工厂模式的升级版,满足了开闭原则(对扩展开放,对修改关闭),解决了简单工厂模式的灵活性差的缺点。工厂模式将创建对象的工作交给了工厂的子类(延迟创建对象)。这样,在需要新增的时候就可以不破坏原来的结构

 代码展示

interface IKeyboard{
    void inPrint();
    void outPrint();
}
class DelKeyboard implements IKeyboard {
    @Override
    public void inPrint() {
        System.out.println("使用功戴尔的键盘输入");
    }
    @Override
    public void outPrint() {
        System.out.println("使用功戴尔的键盘输出");
    }
}
class HPKeyboard implements IKeyboard {
    @Override
    public void inPrint() {
        System.out.println("使用惠普的键盘输入");
    }
    @Override
    public void outPrint() {
        System.out.println("使用惠普的键盘输出");
    }
}
class LenovoKeyboard implements IKeyboard {
    @Override
    public void inPrint() {
        System.out.println("使用联想的键盘输入");
    }
    @Override
    public void outPrint() {
        System.out.println("使用联想的键盘输出");
    }
}
interface IKeyboardFactory{
     IKeyboard createKeyboard();
}
class DelKeyboardFactory implements IKeyboardFactory{
    @Override
    public IKeyboard createKeyboard() {
        return new DelKeyboard();
    }
}
class HPKeyboardFactory implements IKeyboardFactory{
    @Override
    public IKeyboard createKeyboard() {
        return new HPKeyboard();
    }
}
class LenovoKeyboardFactory implements IKeyboardFactory{
    @Override
    public IKeyboard createKeyboard() {
        return new LenovoKeyboard();
    }
}
public class FactoryMethod {
    public static void main(String[] args) {
        IKeyboardFactory LenovoKeyboardFactory = new LenovoKeyboardFactory();//获得联想键盘工厂
        IKeyboard lenovokeyboard = LenovoKeyboardFactory.createKeyboard();//使用联想键盘工厂造具体键盘
        lenovokeyboard.inPrint();//使用联想的键盘输入
        lenovokeyboard.outPrint();//使用联想的键盘输出
    }
}

优缺点:其中最主要的是 IFactory类中的createKeyboard方法,通过这个方法来生成具体产品,这也是为什么叫工厂方法的原因。和简单工厂的静态方法不同,这里是使用的非静态调用方式。而且可以发现,没有了简单工厂中的 if-else逻辑判断,相对而言扩展性也要强的多。

优点:完全实现开闭原则,实现了可扩展和更复杂的层次结构。明确了职责,具有多态性,适用于任何实体类。

缺点:如果业务增加,会使得系统中类的个数成倍增加,提高了代码的复杂度

抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)属于创建型模式,它实际上是对工厂方法模式的扩展,相当于一个超级工厂,用于创建其他工厂的模式。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,而且每个工厂都能按照工厂模式提供对象。其实抽象工厂也是为了减少工厂方法中的子类和工厂类数量,基于此提出的设计模式。

子类提供的方案是一个产品簇cu,是互相匹配的产品。

抽象工厂的本质是:选择产品簇的实现

 代码展示

interface IKeyboard{
    void inPrint();
    void outPrint();
}
interface IMouse{
    void click();
}
interface IMonitor{
    void show();
}
class DelKeyboard implements IKeyboard{
    @Override
    public void inPrint() {
        System.out.println("使用功戴尔的键盘输入");
    }
    @Override
    public void outPrint() {
        System.out.println("使用功戴尔的键盘输出");
    }
}
class DelMonitor implements IMonitor{
    @Override
    public void show() {
        System.out.println("使用戴尔的显示屏观看");
    }
}
class DelMouse implements IMouse{
    @Override
    public void click() {
        System.out.println("使用戴尔的鼠标点击");
    }
}
class HPKeyboard implements IKeyboard{
    @Override
    public void inPrint() {
        System.out.println("使用惠普的键盘输入");
    }
    @Override
    public void outPrint() {
        System.out.println("使用惠普的键盘输出");
    }
}
class HPMonitor implements IMonitor{
    @Override
    public void show() {
        System.out.println("使用戴尔的显示屏观看");
    }
}
class HPMouse implements IMouse{
    @Override
    public void click() {
        System.out.println("使用惠普的鼠标点击");
    }
}
interface IFactory{
    IMouse createMouse();
    IMonitor createMonitor();
    IKeyboard createKeyboard();
}
//创建具体的戴尔工厂用于生产各种戴尔的产品
class DelFactory implements IFactory{
    @Override
    public IMouse createMouse() {
        return new DelMouse();
    }
    @Override
    public IMonitor createMonitor() {
        return new DelMonitor();
    }
    @Override
    public IKeyboard createKeyboard() {
        return new DelKeyboard();
    }
}
//创建具体的惠普工厂用于生产各种惠普的产品 根据需要是否把工厂设置为单例模式
class HPFactory implements IFactory{
    @Override
    public IMouse createMouse() {
        return new HPMouse();
    }
    @Override
    public IMonitor createMonitor() {
        return new HPMonitor();
    }
    @Override
    public IKeyboard createKeyboard() {
        return new HPKeyboard();
    }
}
//相当于客户端
public class AbstractFactory {
    public static void main(String[] args) {
        IFactory iFactory = new HPFactory();//获取惠普工厂
        //使用惠普的工厂创建具体的产品
        IKeyboard keyboard = iFactory.createKeyboard();
        IMonitor monitor = iFactory.createMonitor();
        IMouse mouse = iFactory.createMouse();
        keyboard.inPrint();
        monitor.show();
        mouse.click();
    }
}

优缺点:

优点:增加分组比较容易,而且能大大减少工厂类的数量

缺点:因为分组,所以分组中的产品扩展就比较困难,比如再新增一个IMouse鼠标,就需要改动IFactory、DellFactory和HPFactory几乎所有工厂类

             没有最好的设计模式,只有最适合的设计模式

猜你喜欢

转载自blog.csdn.net/qq_57533658/article/details/129946978