简介
工厂设计模式在java中有大量的应用,如spring框架,这种类型的设计模式属于创建型模式。在工厂设计模式中,创建逻辑不会对客户端暴露,可以通过一个对外接口创建所需对象。
工厂模式使用场景
需要频繁创建对象且这些对象多处使用,业务发生改变需要修改多处代码,使用工厂模式即可进行代码解耦,业务改变修改时只需修改工厂部分代码
简单工厂模式
1.抽象一个对象,定义共性内容
public interface IMarket {
void goods();
}
2.创建具体实现类,实现自己特有内容
public class JdMarket implements IMarket {
@Override
public void goods() {
System.out.println("这是京东的商品");
}
}
public class PddMarket implements IMarket {
@Override
public void goods() {
System.out.println("这是拼多多的商品");
}
}
public class TbMarket implements IMarket {
@Override
public void goods() {
System.out.println("这是淘宝的商品");
}
}
3.创建工厂,定义通过类型获取对应产品对象的方法
public class SimpleFactory {
public static IMarket getMarket(String type) {
switch (type) {
case "JD":
return new JdMarket();
case "TB":
return new TbMarket();
case "PDD":
return new PddMarket();
default:
return null;
}
}
}
测试结果
public class SimpleFactoryTestMain {
public static void main(String[] args) {
// 此处传入京东,获取京东商场
IMarket market = SimpleFactory.getMarket("JD");
market.goods();
}
}
总结:
简单工厂就是将对象抽象,定义共性内容,创建具体实现类。然后创建一个工厂,通过传入不同类型,创建对应对象。在一定程度上解耦代码。未来产品发生变化时,一定程度上减少修改工作量。但是在新增对象时需要修改工厂内部逻辑,对象过多时增加了系统逻辑复杂度,不利于未来的扩展和维护。
工厂方法模式对简单工厂模式进一步抽象定义,使得可以在不修改工厂逻辑的情况下,可以拓展添加新的对象。
抽象工厂类,创建工厂接口,抽象定义获取对象的接口。
public interface IMarketFactory {
IMarket getMarket();
}
定义具体工厂类,实现抽象工厂接口,实现获取对象的方法,由具体的工厂创建对应的对象
public class JdMarketFactory implements IMarketFactory {
@Override
public IMarket getMarket() {
return new JdMarket();
}
}
public class PddMarketFactory implements IMarketFactory {
@Override
public IMarket getMarket() {
return new PddMarket();
}
}
public class TbMarketFactory implements IMarketFactory {
@Override
public IMarket getMarket() {
return new TbMarket();
}
}
测试结果
public class FactoryMethodTestMain {
public static void main(String[] args) {
// 获取京东商场对象
JdMarketFactory jdMarketFactory = new JdMarketFactory();
IMarket market = jdMarketFactory.getMarket();
market.goods();
// 获取淘宝商场对象
TbMarketFactory tbMarketFactory = new TbMarketFactory();
IMarket tbMarket = tbMarketFactory.getMarket();
tbMarket.goods();
}
}
总结
工厂方法模式的优点是具备更高的复用性和可读性,可以在不需要修改工厂逻辑的情况下可以创建新的对象。缺点是需要创建很多的工厂,当类型很多的时候,需要创建的工厂类就很多。



