定义:
在spring和其他的框架中,工厂模式被大量使用,实际上工厂模式就是帮助我们实例化对象的设计模式,因为在实际的项目中,实例化对象的同时,可能对象中有大量的初始化工作,如果每次项目有个地方用到这个实例化,后面都要加上一堆的初始化参数,变量等操作,那就太繁琐了并且后续维护难度大,我们可以把这个动作交给工厂,我们只需要调用工厂给我们提供的方法,就可以获取到初始化完成的对象。
场景:
一个客户到想网上购买一双鞋,考虑两个体育品牌,鸿星尔克和贵人鸟。
同时客户除了鞋子又想再买一件运动服
抽象工厂模式:
此博客是基于工厂方法模式的扩展,在原来的基础上,大工厂添加生产衣服方法,具体工厂去实现:
JAVA -- 工厂模式之 工厂方法模式_DGH2430284817的博客-CSDN博客
鞋产品接口:
public interface Shoes {
/*
* @description: 买鞋
*/
public void buyShoes();
}
鸿星尔克鞋产品:
/*
* @description: 鸿星尔克
*/
public class ERKE implements Shoes {
@Override
public void buyShoes() {
System.out.println("买一双鸿星尔克鞋");
}
}
贵人鸟鞋产品:
/*
* @description: 贵人鸟
*/
public class GRN implements Shoes {
@Override
public void buyShoes() {
System.out.println("买一双贵人鸟鞋");
}
}
衣服产品接口:
public interface Clothes {
/*
* @description: 展示衣服信息
*/
public void showClothes();
}
鸿星尔克衣服产品:
/*
* @description: 鸿星尔克衣服
*/
public class ERKE_Clothes implements Clothes {
@Override
public void showClothes() {
System.out.println("一件鸿星尔克衣服");
}
}
贵人鸟衣服产品:
/*
* @description: 贵人鸟衣服
*/
public class GRN_Clothes implements Clothes {
@Override
public void showClothes() {
System.out.println("一件贵人鸟衣服");
}
}
体育品牌工厂类
public interface SportsFactory {
/*
* @description: 生产鞋
* @return: 对应品牌店生产的鞋产品对象
*/
public Shoes makeShoes() ;
/*
* @description: 生产衣服
* @return: 对应品牌店生产的衣服产品对象
*/
public Clothes makeClothes() ;
}
鸿星尔克工厂类:
public class ERKEFactory implements SportsFactory {
@Override
public Shoes makeShoes() {
//初始化店员,灯光,空调,镜子等等等等
return new ERKE_Shoes();
}
@Override
public Clothes makeClothes() {
//初始化衣服尺寸,衣服款式,颜色等等
return new ERKE_Clothes();
}
}
贵人鸟 工厂类:
public class GRNFactory implements SportsFactory {
@Override
public Shoes makeShoes() {
//初始化店员,灯光,空调,镜子等等等等
return new GRN_Shoes();
}
@Override
public Clothes makeClothes() {
//初始化衣服尺寸,衣服款式,颜色等等
return new GRN_Clothes();
}
}
测试类:
public class mainTest {
public static void main(String[] args) {
//客户买鞋,买衣服
//客户想买鸿星尔克的鞋,创建鸿星尔克品牌工厂
SportsFactory sportsFactory = new ERKEFactory();
//鸿星尔克品牌工厂中创建鸿星尔克鞋产品对象
Shoes shoes = sportsFactory.makeShoes();
//鸿星尔克品牌工厂中创建鸿星尔克衣服产品对象
Clothes clothes = sportsFactory.makeClothes();
//鞋信息
shoes.showShoes();
//衣服信息
clothes.showClothes();
//客户想买贵人鸟的鞋,创建贵人鸟品牌工厂
SportsFactory sportsFactory2 = new GRNFactory();
//贵人鸟品牌工厂中创建贵人鸟鞋产品对象
Shoes shoes2 = sportsFactory2.makeShoes();
//鸿星尔克品牌工厂中创建贵人鸟衣服产品对象
Clothes clothes2 = sportsFactory2.makeClothes();
//鞋信息
shoes2.showShoes();
//衣服信息
clothes2.showClothes();
}
}
效果:
总结:
简单工厂,是把产品对象实例化中初始化的操作给工厂,把这一块代码抽象出来,以后初始化有改动,就只需要改工厂对应方法即可
工厂方法模式,对比简单工厂,简单工厂是把所有产品实例都交给一个大工厂,而工厂方法模式把这个操作细分给了具体的平台工厂,大工厂只提供抽象接口,具体实例化初始化由各自品牌工厂完成
抽象工厂模式, 是工厂方法模式的扩展,因为工厂方法模式是针对一种产品的,在迭代开发过程中,工厂可能需要扩充其他产品的功能,所以有了抽象工厂模式。当以后再有新产品入网球拍啥的,就可以在大工厂中定义新的接口方法,然后具体的工厂中去实现,新产品对应代码也加一套,修改量较小,并且不会影响到原来的产品代码,扩展性较强