设计模式-工厂模式

工厂模式定义 Define an interface for creating an object,but let subclasses decide which class to instantiate.Factory Method lets a class defer instantiation to subclasses.(定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类)

  • 类图比较简单,AbstractCarFactory是一个抽象类,CarFactory为实现类,完成具体的任务——创建车;Car接口是车类的总称,其三个实现类分别为三类车;Client类是一个场景类,负责模拟这个造车场景,执行相关的任务。

image.png

看一个简单的例子

//接口
public interface Car {

    //每个车都有颜色
    public void getColor();

    //每个车都有轮胎颜色
    public void getTire();
}

//实现类
public class AudiBlackCar implements Car {
    @Override
    public void getColor() {
        System.out.println("黑色奥迪车");
    }

    @Override
    public void getTire() {
        System.out.println("黑色轮胎");
    }
}
//实现类
public class AudiRedCar implements Car {
    @Override
    public void getColor() {
        System.out.println("红色奥迪车");
    }

    @Override
    public void getTire() {
        System.out.println("红色轮胎");
    }
}

//实现类
public class AudiWhiteCar implements Car {
    @Override
    public void getColor() {
        System.out.println("白色奥迪车");
    }

    @Override
    public void getTire() {
        System.out.println("白色轮胎");
    }
}
//抽象工厂类
public abstract class AbstractCarFactory {
    public abstract <T extends Car> T createCar(Class<T> c);
}

//实现类
public class CarFactory extends AbstractCarFactory {
    @Override
    public <T extends Car> T createCar(Class<T> c) {
        //定义一个车
        Car car = null;
        try {
            car = (T)Class.forName(c.getName()).newInstance();
        }catch (Exception e) {
            System.out.println("车生产错误");
        }
        return (T)car;
    }
}
//客户端
public class Client {

    public static void main(String[] args) {
        AbstractCarFactory carFactory = new CarFactory();
        AudiBlackCar audiBlackCar = carFactory.createCar(AudiBlackCar.class);
        audiBlackCar.getColor();
        audiBlackCar.getTire();
        System.out.println("+++++++++++++++++++++");
        AudiWhiteCar audiWhiteCar = carFactory.createCar(AudiWhiteCar.class);
        audiWhiteCar.getColor();
        audiWhiteCar.getTire();
        System.out.println("+++++++++++++++++++++");
        AudiRedCar audiRedCar = carFactory.createCar(AudiRedCar.class);
        audiRedCar.getColor();
        audiRedCar.getTire();
    }
}

以上就是一个简单的工厂模式,造不同颜色的车,比较清晰明了

  • 工厂模式的优点

1.良好的封装性,代码结构清晰。创建对象简单只需要知道对象的类名就可以
2.比较容易扩展,增加产品的时候,只需要需改具体工厂类或者新增一个工厂类就可以。
3.屏蔽产品类。产品如何变化,调用者不需要关心,只需要关心接口。
4.工厂类典型解耦框架。高层模块只需要知道产品的抽象类,其他不用关心。

  • 工厂模式使用场景

1.需要灵活,可扩展框架时候可以考虑工厂模式
2.说白了工厂类就是new一个对象的替代品。

  • 工厂模式扩展

1. 把上面例工厂类可以扩展为静态方法

public class EnhangeCarFactory {
    public static   <T extends Car> T createCar(Class<T> c) {
        //定义一个车
        Car car = null;
        try {
            car = (T)Class.forName(c.getName()).newInstance();
        }catch (Exception e) {
            System.out.println("车生产错误");
        }
        return (T)car;
    }
}

2. 把上面例子升级多个工厂:目的是把所有产品放到一个工厂方法里面有可能结构不清晰。现在把生产每种颜色的车工厂都定义一个创造者,让调用者自己去选择与那个工厂关联。

主要代码如下

//抽象类
public abstract class AbstractEnCarFactory {
    public abstract Car createCar();
}
//实现类
public class AudiBlackCarFactory extends AbstractEnCarFactory {

    @Override
    public Car createCar() {
        return new AudiBlackCar();
    }
}
//实现类
public class AudiRedCarFactory extends AbstractEnCarFactory {
    @Override
    public Car createCar() {
        return new AudiRedCar();
    }
}

//实现类
public class AudiWhiteCarFactory extends AbstractEnCarFactory {
    @Override
    public Car createCar() {
        return new AudiWhiteCar();
    }
}
public class Client {

    public static void main(String[] args) {
        Car audiBlackCar = new AudiBlackCarFactory().createCar();
        audiBlackCar.getColor();
        audiBlackCar.getTire();
        Car audiRedCar = new AudiRedCarFactory().createCar();
        audiRedCar.getColor();
        audiRedCar.getTire();
        Car audiWhiteCar = new AudiWhiteCarFactory().createCar();
        audiWhiteCar.getColor();
        audiWhiteCar.getTire();
    }
}

image.png

以上就是工厂模式的基本简单用法,欢迎大家查看并指出不足的地方,万分感谢

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

境里婆娑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值