工厂相关设计模式学习记录

属于创建型设计模式,创建型模式设计对象的实例化,这类模式的特点是,不让用户依赖于对象的创建或排列方式,避免用户直接使用new运算符创建对象。

简单工厂设计模式

核心简述

使用一个工厂类,通过传入的不同参数返回不同的实例对象,通常是某一类型的不同子类。创建的实体类拥有共同的接口或父类。

使用场景

  1. 需要创建的对象较少,且很少会进行修改。
  2. 客户端不关心对象创建过程

优点

可以对创建的对象进行加工,对客户端隐藏细节

缺点

  1. 创建逻辑复杂或创建对象过多而造成代码臃肿

  2. 新增删除子类需要修改工厂类,违反了开闭原则

代码示例

public class MouseFactory {

    public static Mouse createMouse(int type) {
        switch (type) {
            case 0:
                return new DellMouse();
            case 1:
                return new HpMouse();
            default:
                return new DellMouse();
        }
    }

    public static void main(String[] args) {
        createMouse(1).click();
        createMouse(2).click();
    }

}


public interface Mouse {

    void click();

}

public class DellMouse implements Mouse {
    @Override
    public void click() {
        System.out.println("Dell Click");
    }
}

public class HpMouse implements Mouse{
    @Override
    public void click() {
        System.out.println("Hp Click");
    }
}

工厂方法设计模式

核心简述

为了符合开闭原则,不修改现有的工厂类,所以对工厂类也做了分类,不同类型的实例使用不同的实例工厂,所有实例工厂拥有共同的工厂父类或接口。

优点

对客户端隐藏对象创建细节

缺点

  1. 创建一个新的类型时,需要创建对应的实例类型和工厂类型,双倍的代码编写
  2. 只能创建同一种类型的对象,无法满足多种类型的创建。

代码示例

public interface MouseFactory {

    Mouse createMouse();

}


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

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

public class MethodFactoryDemo {

    public static void main(String[] args) {
        MouseFactory factory = new DellMouseFactory();
        factory.createMouse().click();
    }

}

抽象工厂设计模式

工厂方法虽然可以做到开闭原则,但是无法创建不同的对象类型,抽象工厂模式则可以解决这一个问题,可以认为抽象工厂抽象的是产品的类型,支持不同产品的创建。

个人理解抽象工厂并不是对工厂方法的扩展,而是从对象的类型角度进行了区分,抽象工厂支持不同对象类型的创建,而工厂方法仅是针对同一种对象类型做创建。

优点

可以创建不同类型的对象,新增一个工厂是不会违反开闭原则的。

缺点

新增一个产品类型,仍然需要修改各个工厂类,违反开闭原则

代码示例

public interface ComputerFactory {

    Mouse createMouse();

    Keyboard createKeyboard();

}

public class DellComputerFactory implements ComputerFactory {
    @Override
    public Mouse createMouse() {
        return new DellMouse();
    }

    @Override
    public Keyboard createKeyboard() {
        return new DellKeyboard();
    }
}

public class HpComputerFactory implements ComputerFactory {
    @Override
    public Mouse createMouse() {
        return new HpMouse();
    }

    @Override
    public Keyboard createKeyboard() {
        return new HpKeyboard();
    }
}

public class AbstractFactoryDemo {

    public static void main(String[] args) {
        ComputerFactory computerFactory = new DellComputerFactory();
        computerFactory.createKeyboard().beat();
        computerFactory.createMouse().click();
    }

}

public interface Keyboard {

    void beat();

}


public class HpKeyboard implements Keyboard {
    @Override
    public void beat() {
        System.out.println("惠普 键盘");
    }
}


public class DellKeyboard implements Keyboard {
    @Override
    public void beat() {
        System.out.println("戴尔 键盘");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值