设计模式之工厂(二)
程序员文章站
2022-03-09 16:33:13
...
续集工厂模式之工厂(一)
工厂方法模式
我们都知道简单工厂模式的缺点是担任工厂角色的工厂类的扩展和维护方面极为差,为了能够解决这一问题,我们需要将工厂类进一步的抽象,于是,这一件的工厂方法模式就有一下几个角色:
抽象工厂:工厂方法模式的核心,与应用程序无关,任何在模式中创建的对象的工厂必须实现这个接口,
具体工厂:实现抽象工厂接口的具体工厂类,包含了与应用程序的相关设计逻辑,并且受到应用程序调用以创建产品对象。
抽象产品:工厂方法模式所创建的超类型。也就是所有产品对象的父类或者拥有共同特性的接口
具体产品:这个角色实现了抽象产品中角色定义的接口。某个具体的产品有专门的的具体的工厂去负责创建。他们之间是一一对应的。
下面为一个简单的小栗子
抽象工厂角色
/**
*
* 角色1:抽象工厂 - 负责获取食物
*/
public interface MethodFoodFactory {
//获取食物的方法
public IFishFood getFood();
}
具体工厂:南方食物-鱼,北方食物-鱼
/**
* 南方口味外卖 - 鱼
*/
public class SouthFishFactory implements MethodFoodFactory{
@Override
public IFishFood getFood() {
return new SouthFishFood();
}
}
/**
* 北方口味外卖 - 鱼
*/
public class NorthFishFactory implements MethodFoodFactory{
@Override
public IFishFood getFood() {
return new NorthFishFood();
}
}
具体产品:南方食物鱼、北方食物鱼
/**
* 北方口味 - 鱼
*/
public class NorthFishFood implements IFishFood {
@Override
public void showFood() {
System.out.println("来自北方厨师做的鱼");
}
}
/**
* 南方口味-鱼
*/
public class SouthFishFood implements IFishFood{
@Override
public void showFood() {
System.out.println("来自南方厨师做的鱼");
}
}
客户端调用
/**
* 客户端
*/
public class MainTest {
public static void main(String[] args) {
//点一个南方口味外卖
MethodFoodFactory southFoodFactory = new SouthFishFactory();
//点一个北方口味外卖
MethodFoodFactory northFoodFactory = new NorthFishFactory();
//拿到南方口味外卖鱼
southFoodFactory.getFood().showFood();
//拿到北方口味外卖鱼
northFoodFactory.getFood().showFood();
}
}
相比简单工厂模式,该模式弥补了前者扩展性和维护性的缺点,而且,通过分析整个逻辑,我们可以看到,用户不必知道具体创建过程,甚至不用知道具体产品的名称。
但是,从这里我们不难发现,我们在扩展的时候,每增加一个产品,我们都需要增加一个具体类和对应的工厂,在一定程度上增加系统的复杂度。
抽象工厂模式
我们都知道工厂方法的模式在我们每一次新增一个产品的时候,我们都需要去创建相应的产品以及产品的工厂类。但是,这并不太现实。在我们开发的过程中,不难发现有些的工厂是极其相识的,所以,我们需要对目前状况进一步的提取共同点,对工厂方法中的抽象工厂角色优化。