文章目录
介绍
在抽象工厂模式中,不仅有抽象工厂
,还有抽象零件
,抽象产品
。其中抽象工厂主要的工作职责将抽象零件
组装成抽象产品
。
第一大段,这么多抽象,抽象
的含义到底是啥?它指:不考虑具体怎样实现,而是仅关注接口(API)的状态
。
综上所诉:在 Abstract Factory 模式中将会出现抽象工厂,它会将抽象零件组装为抽象产品。也就是说,
我们并不关心零件的具体实现,而是只关心接口(API)。我们仅使用该接口(API)将零件组装成为产品
。
开始
架构图(以穿搭举例)
抽象工厂作为主接口,不具备任何含义,只记录有上衣和下装。在季节工厂里面(也可以叫做季节产品),他们生产了一系列相应季节的上衣和下装。但对上衣和下装同时是比较抽象的,需要对上衣和下装(也可以叫做零件)赋予真正的含义,如:在上衣中有短袖、衬衫;在下装中,有牛仔裤和短裤。
通过具体的零件,才有了品牌打出了季节产品,最后统称抽象为上衣、下装。
样例一(html关于列表和表格的应用)
定义抽象工厂(html)
public interface HtmlFactory {
/**
* 创建一个抽象托盘
*
* @return
*/
TrayService createTray();
}
定义抽象工厂需要制作抽象产物(托盘)
为什么要单独定义一个item接口,是因为对于html代码,我们的产物有<a>标签
,<b>标签
等,最后都是需要一个html的模板所以,定义了一个item接口,让后续的抽象产物继承。
public interface Item {
/**
* 生成 html 代码
*/
String makeHTML();
}
public interface TrayService extends Item {
}
定义具体工厂(列表、表格)
@Service
@Slf4j
public class ListHtmlFactory implements HtmlFactory {
@Resource(name = "listTrayServiceImpl")
private TrayService trayService;
@Override
public TrayService createTray() {
return trayService;
}
}
@Service
@Slf4j
public class TableHtmlFactory implements HtmlFactory {
@Resource(name = "tableTrayServiceImpl")
private TrayService trayService;
@Override
public TrayService createTray() {
return trayService;
}
}
定义工厂生产零件(托盘)
@Service
@Slf4j
public class ListTrayServiceImpl implements TrayService {
@Override
public String makeHTML() {
return "<ul>\n" +
" <li>咖啡</li>\n" +
" <li>茶</li>\n" +
" <li>牛奶</li>\n" +
"</ul>";
}
}
@Service
@Slf4j
public class TableTrayServiceImpl implements TrayService {
@Override
public String makeHTML() {
return "<table>\n" +
" <tr>\n" +
" <th>月份</th>\n" +
" <th>储蓄</th>\n" +
" </tr>\n" +
" <tr>\n" +
" <td>一月</td>\n" +
" <td>¥3400</td>\n" +
" </tr>\n" +
" <tr>\n" +
" <td>二月</td>\n" +
" <td>¥4500</td>\n" +
" </tr>\n" +
"</table>";
}
}
样例二(衣服关于春季和夏季的穿搭)
定义抽象工厂(穿搭)
public interface WearFactory {
/**
* 创建一个 衣服
*
* @return
*/
ClothesService createClothe();
/**
* 创建一个 裤子
*
* @return
*/
TrousersService createTrouser();
}
定义抽象工厂需要制作抽象产物(上衣、下装)
public interface ClothesService {
/**
* 短袖
*/
void shortSleeve();
/**
* 衬衫
*/
void shirt();
}
public interface