废话不多说,还是三部曲,以下围绕是什么,干嘛用,怎么用展开
1、是什么
顾名思义,工厂模式就是一个工厂去生产和管理各个产品,让外部不用关注产品的细节,只知道和使用最终的产品。属于创造型设计模式
分类:
根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式
根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式
- 简单工厂模式
简单的对不同类对象的创建进行了一层薄薄的封装。该模式通过向工厂传递类型来指定要创建的对象,也就是在一个小工厂,啥都做,根据传过来的类型生产不同的产品
uml图
- 工厂方法模式(Factory Method)
和简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂,也就是有专门的工厂生产专门的产品。
UML类图如下:
- 抽象工厂模式(Abstract Factory)
以上只针对一个产品,如果新的其他产品生产怎么办,这时候就引入抽象工厂模式
抽象工厂模式通过在AbstarctFactory中增加创建产品的接口,并在具体子工厂中实现新加产品的创建,当然前提是子工厂支持生产该产品。否则继承的这个接口可以什么也不干。
其UML类图如下:
2、干嘛用
1)工厂模式是为了解耦
2)工厂模式可以降低代码重复
3)因为工厂管理了对象的创建逻辑,使用者并不需要知道具体的创建过程,只管使用即可,减少了使用者因为创建逻辑导致的错误。
4)可以通过参数设置,返回不同的构造函数,不需要修改使用类的地方。
3、怎么用
(简单工厂模式)
一个工厂干所有的活
//工厂类
public class ObjectFactory {
public Car makeCar(String phoneType) {
if ("wuling".equals(phoneType)) {
return new WulingCar();
} else if ("byd".equals(phoneType)) {
return new BydCar();
}
return null;
}
}
//抽象汽车
public interface Car {
public void makeCar();
}
//五菱汽车
public class WulingCar implements Car {
public WulingCar() {
this.makeCar();
}
public void makeCar() {
System.out.println("生产五菱神车");
}
}
//比亚迪汽车
public class BydCar implements Car {
public BydCar() {
this.makeCar();
}
public void makeCar() {
System.out.println("生产比亚迪汽车");
}
}
//造汽车
public class Test {
public static void main(String[] args) {
ObjectFactory factory=new ObjectFactory();
Car wuling = factory.makeCar("wuling");
Car byd = factory.makeCar("byd");
}
}
工厂方法模式(Factory Method)
各个产品有自己的工厂
//抽象工厂
public interface ObjectFactory {
void makeCar();
}
//五菱工厂
public class BydFactory implements ObjectFactory {
public void makeCar() {
BydCar bydCar = new BydCar();
System.out.println(bydCar.getName());
}
}
//抽象汽车类
public class Car {
private String name;
public Car(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//五菱汽车
public class WulingCar extends Car {
public WulingCar() {
super("生產五菱汽車");
}
}
//比亚迪工厂
public class BydFactory implements ObjectFactory {
public void makeCar() {
BydCar bydCar = new BydCar();
System.out.println(bydCar.getName());
}
}
//比亚迪汽车
public class BydCar extends Car {
public BydCar() {
super("生產比亚迪汽车");
}
}
//造汽车
public class MakeCar {
public static void main(String[] args) {
WulingFactory wulingFactory = new WulingFactory();
wulingFactory.makeCar();
BydFactory bydFactory = new BydFactory();
bydFactory.makeCar();
}
}
抽象工厂模式(Abstract Factory)
//疫情期间五菱和比亚迪都生产口罩
所以这时候五菱和比亚迪就不单单是造汽车的工厂了,还造口罩,后面还造其他各种产品,所以得把工厂进一步抽象。
下面是设计的过程
//成立一个抽象工厂,可以生产汽车和口罩的工厂
//五菱生产工厂
//比亚迪生产工厂
//汽车抽象类
//口罩抽象类
//五菱汽车
//比亚迪汽车
//五菱口罩
//比亚迪口罩
代码实现:
//成立一个抽象工厂,可以生产汽车和口罩的工厂
public interface ObjectFactory {
void makeCar();
void makeMask();
}
//五菱生产工厂
public class WulingFactory implements ObjectFactory {
public void makeCar() {
WulingCar wulingCar = new WulingCar();
System.out.println("生产" + wulingCar.getName());
}
public void makeMask() {
WulingMask wulingMask = new WulingMask();
System.out.println("生产" + wulingMask.getName());
}
}
//比亚迪生产工厂
public class BydFactory implements ObjectFactory {
public void makeCar() {
BydCar bydCar = new BydCar();
System.out.println("生产" + bydCar.getName());
}
public void makeMask() {
BydMask bydMask = new BydMask();
System.out.println("生产" + bydMask.getName());
}
}
//汽车父类
public class Car {
private String name;
public Car(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//口罩父类
public class Mask {
private String name;
public Mask(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//五菱汽车
public class WulingCar extends Car {
public WulingCar() {
super("五菱汽車");
}
}
//比亚迪汽车
public class BydCar extends Car {
public BydCar() {
super("比亚迪汽车");
}
}
//五菱口罩
public class WulingMask extends Mask {
public WulingMask() {
super("比亚迪口罩");
}
}
//比亚迪口罩
public class BydMask extends Mask {
public BydMask() {
super("比亚迪口罩");
}
}
测试
public class Test {
public static void main(String[] args) {
WulingFactory wulingFactory = new WulingFactory();
wulingFactory.makeCar();
wulingFactory.makeMask();
BydFactory bydFactory = new BydFactory();
bydFactory.makeCar();
bydFactory.makeMask();
}
}
以上。