Java设计模式-工厂模式

5、工厂模式

工厂就是创建产品,该模式就是将创建对象的任务交给工厂。

1、简单工厂模式

也称为静态工厂模式,不属于32种经典设计模式,违背“开闭原则”,举例如下:

在这里插入图片描述

上面是UML类图,其中是类的一些关系。代码如下:

public interface  Car {
    void printName();
}

public class BMW implements Car {
    @Override
    public void printName() {
        System.out.println("BMW车来了" );
    }
}

public class Wuling implements Car{
    @Override
    public void printName() {
        System.out.println("五菱车来了");
    }
}

public class CarFactory {
    public static Car getCar(String car){

        if(car.equals("Wuling")){
            return new Wuling();
        }else if(car.equals("BMW")){
            return new BMW();
        }else{
            return null;
        }
    }
    
    //或者是这种
    public static Car getBMW(){
        return new BMW();
    }
    public static Car getWuLing(){
        return new Wuling();
    }
}

public class Customer {
    public static void main(String[] args) {
        Car car1 = CarFactory.getCar("Wuling");
        Car car2 = CarFactory.getCar("BMW");
        car1.printName();
        car2.printName();
    }
}

2、工厂方法模式

就是在不修改类的前提下,通过增加新的工厂类实现扩展。(开闭原则)

在这里插入图片描述

代码如下:

public interface  Car {
    void name();
}

public class BMW implements Car {
    @Override
    public void name() {
        System.out.println("BMW车来了" );
    }
}

public class Wuling implements Car {
    @Override
    public void name() {
        System.out.println("五菱车来了");
    }
}

public class Mobile implements Car {
    @Override
    public void name() {
        System.out.println("摩拜车来了");
    }
}

public interface CarFactory {
    Car getCar();
}

public class BMWFactory implements CarFactory {
    public  Car getCar() {
        return new BMW();
    }
}

public class MobileFactory implements CarFactory {
    @Override
    public Car getCar() {
        return new Mobile();
    }
}

public class WuLingFactory implements CarFactory {
    @Override
    public Car getCar() {
        return new Wuling();
    }
}

public class Customer {
    public static void main(String[] args) {
        Car car1 = new WuLingFactory().getCar();
        Car car2 = new BMWFactory().getCar();
        car1.name();
        car2.name();
        Car car3 = new MobileFactory().getCar();
        car3.name();
    }
}

3、抽象工厂模式

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。这个抽象工厂会被实现到多个实际工厂,每个实际工厂负责创建多个实际产品。(就是其他工厂实现这个抽象工厂接口。)

适用场景:

适合 一系列产品 同一产品族一起使用创建的场景。(比如抽象工厂定义制作手机接口和制作路由接口,那么苹果工厂就实现抽象工厂,就能制作手机和路由,那么苹果工厂制作手机和路由是苹果工厂的产品族。小米工厂制作的就是小米工厂的产品族。)

优点:

将一个系列的产品统一到一起进行创建。

缺点:

在规定了所有可能被创建的产品集合,想在产品集合中添加新的产品较困难,需要修改接口中的内容,违反了开闭原则。

示例如下:

在这里插入图片描述

public interface IRouterProduct {
    void printName();
}

public interface IPhoneProduct {
    void printName();
}

public class HuaweiPhone implements IPhoneProduct{
    @Override
    public void printName() {
        System.out.println("华为手机");
    }
}

public class HuaweiRouter implements IRouterProduct {
    @Override
    public void printName() {
        System.out.println("华为路由");
    }
}

public class XiaomiPhone implements IPhoneProduct{
    @Override
    public void printName() {
        System.out.println("小米手机");
    }
}

public class XiaomiPhone implements IPhoneProduct{
    @Override
    public void printName() {
        System.out.println("小米手机");
    }
}

//抽象工厂
public interface AbstarctFactory {
    IRouterProduct getRouter();
    IPhoneProduct getPhone();
}

public class HuaweiFactory implements AbstarctFactory {
    @Override
    public IRouterProduct getRouter() {
        return new HuaweiRouter();
    }

    @Override
    public IPhoneProduct getPhone() {
        return new HuaweiPhone();
    }
}

public class XiaomiFactory implements AbstarctFactory{
    @Override
    public IRouterProduct getRouter() {
        return new XiaomiRouter();
    }

    @Override
    public IPhoneProduct getPhone() {
        return new XiaomiPhone();
    }
}

//测试类
public class TsetAbstratcFactory {
    public static void main(String[] args) {
        //小米工厂
        AbstarctFactory xiaomiFactory = new XiaomiFactory();
        IPhoneProduct xiaomiPhone = xiaomiFactory.getPhone();
        IRouterProduct xiaomiRouter = xiaomiFactory.getRouter();
        xiaomiPhone.printName();   //小米手机
        xiaomiRouter.printName();	//小米路由

        //华为工厂
        AbstarctFactory huaweiFactory = new HuaweiFactory();
        IPhoneProduct huaweiPhone = huaweiFactory.getPhone();
        IRouterProduct huaweiRouter = huaweiFactory.getRouter();
        huaweiPhone.printName();   //华为手机
        huaweiRouter.printName();   //华为路由
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值