java超级工厂_Java设计模式---工厂模式学习笔记

Java设计模式---单例模式学习笔记

工厂模式简介

简单的来说就是在新建一个实例的时候,不使用new而是直接用工厂创建,使用工厂直接返回一个实例。

使用工厂方法将创建实例的工作封装起来,这样在调用的时候无需关心复杂的实例化问题(直接拿来用就可以了)

三种工厂模式

简单工厂模式

工厂方法模式

抽象工厂模式

其中各有各的优缺点

这里直接拿造车举例(PS:没有专业的画图工具,UML图可能画得不好)

简单工厂模式

UML类图

b095215a81c171019839356a7a141129.png

规范

ICar: 车的规范接口

public interface ICar {

void name(); //车的名字

void make(); //生产车

}

制造过程

Benz: 制造奔驰车

//应为是车,所以要满足车规范

public class Benz implements ICar{

@Override

public void name() {

//车名

System.out.println("这是奔驰车");

}

@Override

public void make() {

//制造车

System.out.println("制造奔驰车");

}

}

Bmw: 制造宝马车

public class Bmw implements ICar{

@Override

public void name() {

System.out.println("这是宝马车");

}

@Override

public void make() {

System.out.println("制造宝马车");

}

}

封装到厂

CarFactory: 车工厂(直接在这造车,这个大厂既可以造Benz也可以造Bmw)

public class CarFactory {

public ICar CreateCar(String CarName) {

//车工厂,传入参数取车

if(CarName.equals("Benz")) {

return new Benz();

}else if(CarName.equals("Bmw")) {

return new Bmw();

}

//都不是的话就返回空

return null;

}

}

模拟造车

Client: 模拟车厂造车(演示)

public class Client {

public static void main(String[] args) {

//现创建造车工厂

CarFactory carFactory = new CarFactory();

//制造Benz

ICar benz = carFactory.CreateCar("Benz");

benz.make(); //制造奔驰车

benz.name(); //这是奔驰车

System.out.println("------------------");

//制造Bmw

ICar bmw = carFactory.CreateCar("Bmw");

bmw.make(); //制造宝马车

bmw.name(); //这是宝马车

}

}

优点和缺点

简单工厂模式的优点显而易见,将实例化的创建和使用分成了两个部分,我们只需要传入一个参数就可以得到一个对象

缺点当然也是有的,比如我们现在如果想要多造一种车大众(DaZhong),我们不得不修改CarFactory的代码(CreateCar 指定新的字符串)才可以生效,

这就违反了开闭原则(对扩展开放,对修改关闭)

于是工厂方法模式应之而生

工厂方法模式

在上面的基础上新增了一层ICarFactory,每种车都有各自的工厂,ICarFactory将所有工厂的规范整合

这样如果要新增一种车,直接implete这个厂接口就可以了,各自在各自的厂里造车

UML类图

b333687798eae0c04bcdeecaff2bc137.png

规范

ICar: 车的规范接口

public interface ICar {

void name();

void make();

}

ICarFactory: 工厂规范接口

public interface ICarFactory {

ICar CreateCar();

}

制造过程

Benz: 制造奔驰车

public class Benz implements ICar{

@Override

public void name() {

System.out.println("这是奔驰车");

}

@Override

public void make() {

System.out.println("制造奔驰车");

}

}

Bmw: 制造宝马车

public class Bmw implements ICar{

@Override

public void name() {

System.out.println("这是宝马车");

}

@Override

public void make() {

System.out.println("制造宝马车");

}

}

封装到厂

BenzFactory: 制造奔驰车的工厂

public class BenzFactory implements ICarFactory{

@Override

public ICar CreateCar() {

return new Benz();

}

}

BmwFactory: 制造宝马车的工厂

public class BmwFactory implements ICarFactory{

@Override

public ICar CreateCar() {

return new Bmw();

}

}

此时如果我们想要增加新的车,直接建类实现ICar和ICarFactory接口就行

eg

7617641543b8a3699a7f6db571cc6a6e.png

模拟造车

Client:

public class Client {

public static void main(String[] args) {

ICar benz = new BenzFactory().CreateCar();

benz.make();

benz.name();

ICar bmw = new BmwFactory().CreateCar();

bmw.make();

bmw.name();

}

}

优点和缺点

优点: 如果要增加新的车辆,直接实现两个接口即可

缺点: 但是如果车厂现在要新增一类载具(比如说造坦克),那样我们不得不改变ICarFactory,这就又违反了开闭原则

抽象工厂模式

新增一个超级工厂,其余的工厂implete这个工厂

UML类图

f4432f639f9a27b82d4f8b3d521541f7.png

规范

ICar: 车的规范接口

public interface ICar {

void name();

void make();

}

ITank: 坦克规范接口

public interface ITank {

void name();

void make();

}

ISuperFactory: 超级工厂接口

public interface ISuperFactory {

ICar CreateCar();

ITank CreateTank();

}

制造过程

BenzCar: 制造奔驰车

public class BenzCar implements ICar{

@Override

public void name() {

System.out.println("这是奔驰车");

}

@Override

public void make() {

System.out.println("制造了奔驰车");

}

}

BenzTank: 制造奔驰坦克

public class BenzTank implements ITank{

@Override

public void name() {

System.out.println("这是奔驰坦克");

}

@Override

public void make() {

System.out.println("制造了奔驰坦克");

}

}

封装到厂

BenzFactory: 奔驰的车厂(用于生产奔驰车和奔驰坦克)

public class BenzFactory implements ISuperFactory{

@Override

public ICar CreateCar() {

return new BenzCar();

}

@Override

public ITank CreateTank() {

return new BenzTank();

}

}

Bmw类似于是不再赘述

模拟造车

public class Client {

public static void main(String[] args) {

//造Benz工厂

BenzFactory benzFactory = new BenzFactory();

//造BenzCar

ICar benzCar = benzFactory.CreateCar();

benzCar.make();

benzCar.name();

//造BenzTank

ITank benzTank = benzFactory.CreateTank();

benzTank.make();

benzTank.name();

}

}

优点和缺点

优点: 及其稳定,如果其中的一个厂坏了,不会影响到另一个

缺点: 如果要新增工厂功能,修改极大

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值