本文介绍了工厂模式,抽象工厂模式并附有java代码实现demo。内容仅供参考使用,有不足之处请及时指出,也欢迎大家交流探讨。
工厂模式
工厂模式是创建型模式的一种,工厂模式是对产品的抽象。
场景
假设你下订单到厂家买灯泡,这时厂家会根据你的需求制作对应的灯泡。但是你并不关心灯泡是这么制作的,你只要拿到自己所需的灯泡就满足了。这种场景可以用工厂设计模式。
示例
创建一个灯接口,有发光方法。
public interface Lamp {
void shine();
}
灯有对应的发光颜色,这里创建大中小三种型号的灯实例。
public class BigLamp implements Lamp{
@Override
public void shine() {
System.out.println("我是一个大灯!");
}
}
public class MiddleLamp implements Lamp {
@Override
public void shine() {
System.out.println("我是一个中灯!");
}
}
public class LittleLamp implements Lamp {
@Override
public void shine() {
System.out.println("我是一个小灯!");
}
}
创建一个灯工厂,用来根据需要生产灯实例。
public class LampFactory {
public static Lamp makeLamp(String size) {
if ("big".equals(size)) {
return new BigLamp();
}
if ("middle".equals(size)) {
return new MiddleLamp();
}
return new LittleLamp();
}
}
下一个大灯订单,工厂会根据你的需要制作一个大灯。
Lamp lamp = LampFactory.makeLamp("big");
lamp.shine();
输出
我是一个大灯!
抽象工厂模式
抽象工厂模式是创建型模式的一种,抽象工厂模式是对产品族的抽象。
场景
你下了订单买了灯之后,发现缺少适合的灯座,这时,你需要下订单买一个与之匹配的灯座,灯与灯座之间是有关联关系的,大灯配大灯座,中灯配中灯座,小灯配小灯座,这里如果接的用工厂模式创建一个灯座工厂,会出现一个问题,那就是灯,和灯座是分别下订单买的,有可能买回来,发现并不匹配。这种场景就可以用抽象工厂模式来解决这个问题。
示例
灯接口及对应的大中小三种型号的灯实例。
public interface Lamp {
void shine();
}
public class BigLamp implements Lamp{
@Override
public void shine() {
System.out.println("我是一个大灯!");
}
}
public class MiddleLamp implements Lamp {
@Override
public void shine() {
System.out.println("我是一个中灯!");
}
}
public class LittleLamp implements Lamp {
@Override
public void shine() {
System.out.println("我是一个小灯!");
}
}
灯座接口及对应的大中小三种型号的灯座实例。
public interface LampHolder {
void holdLamp();
}
public class BigLampHolder implements LampHolder {
@Override
public void holdLamp() {
System.out.println("我是一个大灯座!");
}
}
public class MiddleLampHolder implements LampHolder {
@Override
public void holdLamp() {
System.out.println("我是一个中灯座!");
}
}
public class LittleLampHolder implements LampHolder {
@Override
public void holdLamp() {
System.out.println("我是一个小灯座!");
}
}
创建抽象工厂接口,具有制作灯和灯座的方法。
public interface AbstractFactory {
Lamp makeLamp();
LampHolder makeLampHolder();
}
创建大中小三种型号的抽象工厂实例。
public class BigFactory implements AbstractFactory {
@Override
public Lamp makeLamp() {
return new BigLamp();
}
@Override
public LampHolder makeLampHolder() {
return new BigLampHolder();
}
}
public class MiddleFactory implements AbstractFactory {
@Override
public Lamp makeLamp() {
return new MiddleLamp();
}
@Override
public LampHolder makeLampHolder() {
return new MiddleLampHolder();
}
}
public class LittleFactory implements AbstractFactory {
@Override
public Lamp makeLamp() {
return new LittleLamp();
}
@Override
public LampHolder makeLampHolder() {
return new LittleLampHolder();
}
}
创建工厂生产者,用来创建对应型号的工厂。
public class FactoryProducer {
public static AbstractFactory prodecerFactory(String size) {
if ("big".equals(size)) {
return new BigFactory();
}
if ("middle".equals(size)) {
return new MiddleFactory();
}
return new LittleFactory();
}
}
下一个大型号订单,工厂会根据你的需要制作相应的灯,灯座。
public class AbstractFactoryDemo {
public static void main(String[] args) {
AbstractFactory abstractFactory = FactoryProducer.prodecerFactory("big");
Lamp lamp = abstractFactory.makeLamp();
LampHolder lampHolder = abstractFactory.makeLampHolder();
lamp.shine();
lampHolder.holdLamp();
}
}
输出
我是一个大灯!
我是一个大灯座!
区别
工厂模式是针对产品的抽象,抽象工厂模式是针对产品族的抽象。
对比 | 灯产品 | 灯座产品 |
---|---|---|
大型号产品族 | 大灯 | 大灯座 |
中型号产品族 | 中灯 | 中灯座 |
小型号产品族 | 小灯 | 小灯座 |
大灯,中灯,小灯是同一产品等级的产品,大灯和大灯座是不同产品等级的产品,大灯和大灯座组成一个产品族,产品族由不同产品等级的产品根据某些关系组成。
网友评论