工厂模式及抽象工厂模式

工厂模式

工厂模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

工厂模式主要解决接口选择的问题,定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

优点:
1、一个调用者想创建一个对象,只要知道其名称就可以了。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
3、屏蔽产品的具体实现,调用者只关心产品的接口。

缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。

实现:
1.创建一个接口:

public interface Car {
    void Car();
}

2.创建实现接口的实体类

public class BMW implements Car {//宝马车
    @Override
    public void Car() {
        System.out.println("BMW...");
    }
}
public class AUDI implements Car {//奥迪车
    @Override
    public void Car() {
        System.out.println("AUDI...");
    }
}

3.创建一个工厂,通过 createCar方法生成汽车的实体类的对象。

public class CarFactory {
    //传入车名称,工厂进行制造
    public Car createCar(String Car){
        if (Car == null){
            return null;
        }
        if (Car.equalsIgnoreCase("AUDI")){
            System.out.println("create AUDI");
            return new AUDI();
        }else if (Car.equalsIgnoreCase("BMW")){
            System.out.println("create BMW");
            return new BMW();
        }
        return null;
    }
}

4.使用该工厂

public class FactoryDemo {
    public static void main(String[] args) {
        //实例化一个CarFactory类对象
        CarFactory carFactory = new CarFactory();
        //获取一个Car的对象AUDI
        Car audi = carFactory.createCar("AUDI");
        //调用该对象的Car方法
        audi.Car();
        //获取一个Car的对象BMW
        Car bmw = carFactory.createCar("BMW");
        //调用该对象的Car方法
        bmw.Car();
    }
}

运行结果:
在这里插入图片描述

抽象工厂模式

抽象工厂模式是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式。

抽象工厂模式除了具有工厂方法模式的优点外,其他主要优点如下:
可以在抽象产品类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
当增加一个新的产品族时不需要修改原代码,满足开闭原则。

其缺点是:当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。

1.创建抽象产品类

//创建鼠标接口
public interface Mouse {
    public void showMouse();
}
//创建键盘接口
public interface Keybo {
    public void showKeybo();
}

2.创建实现接口的具体产品类

戴尔鼠标类

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

惠普鼠标类

public class HPMouse implements Mouse{
    @Override
    public void showMouse() {
        System.out.println("HPMouse..");
    }
}

戴尔键盘类

public class DellKeybo implements Keybo{
    @Override
    public void showKeybo() {
        System.out.println("DellKeybo..");
    }
}

惠普键盘类

public class HPKeybo implements Keybo{
    @Override
    public void showKeybo() {
        System.out.println("HPKeybo..");
    }
}

3.创建抽象工厂

public abstract class AbstractFactory {
    public abstract Mouse creatMouse();
    public abstract Keybo creatKeybo();
}

4.实现抽象类来创建具体的工厂
实现戴尔工厂

public class DellFactory extends AbstractFactory{

    @Override
    public Mouse creatMouse() {
            System.out.println("creat DellMouse..");
            return new DellMouse();
    }

    @Override
    public Keybo creatKeybo() {
            System.out.println("creat DellKeybo..");
            return new DellKeybo();
    }
}

实现惠普工厂

public class HPFactory extends AbstractFactory{

    @Override
    public Mouse creatMouse() {
        System.out.println("creat HPMouse..");
        return new HPMouse();
    }

    @Override
    public Keybo creatKeybo() {
        System.out.println("creat HPKeybo..");
        return new HPKeybo();
    }
}

4.创建一个选择器,通过传入参数选择创建什么工厂

public class Choice {
    public static AbstractFactory getFactory(String choice){
        if (choice == null){
            return null;
        }
        if (choice.equalsIgnoreCase("Dell")){
            return new DellFactory();
        }
        if (choice.equalsIgnoreCase("HP")){
            return new HPFactory();
        }
        return null;
    }
}

5.使用工厂
创建一个戴尔工厂:

public class AbstractFactoryDemo {
    public static void main(String[] args) {
        //创建dell工厂
        AbstractFactory abstractFactory = Choice.getFactory("dell");
        Keybo keybo = abstractFactory.creatKeybo();
        keybo.showKeybo();
        Mouse mouse = abstractFactory.creatMouse();
        mouse.showMouse();
    }
}

结果如下:
在这里插入图片描述
创建一个惠普工厂:

public class AbstractFactoryDemo {
    public static void main(String[] args) {
        //创建hp工厂
        AbstractFactory abstractFactory = Choice.getFactory("hp");
        Keybo keybo = abstractFactory.creatKeybo();
        keybo.showKeybo();
        Mouse mouse = abstractFactory.creatMouse();
        mouse.showMouse();
    }
}

结果如下:
在这里插入图片描述
可以看出,创建不同的工厂我们只需要将传入选择器的参数改变即可。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值