版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35165632/article/details/83750534
工厂模式和抽象工厂模式:
工厂方法模式:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到之类。
抽象工厂模式:提供一个接口,用于创建相关或以来对象的家族,而不需要明确指定具体类。
解释:工厂方法使用继承把对象的创建交给之类,子类实现工厂方法来创建对象。抽象工厂使用对象的组合:对象的创建被实现在工厂接口所暴露出来的方法中。所有工厂模式都通过减少应用程序和具体类间的依赖促进松耦合。工厂方法允许类将实例化延迟到子类进行。抽象工厂创建相关的对象家族,而不需要依赖他们的具体类。依赖倒置原则,指导我们避免依赖具体类型,尽量依赖抽象。
设计原则:依赖抽象,不要依赖具体类。
以一个饺子店的业务为例。通过对不同业务的整合,分别完成工厂模式和抽象工厂模式。
以下是针对制作不同的饺子进行的工厂模式的设计。
/**
这是一个饺子的工厂父类,用于饺子的创建
**/
public abstract JiaoZiFactory{
/**
生成饺子
**/
public orderJiaoZi(){
// 做馅料
doFillings();
// 包饺子
makeJiaoZi();
// 煮饺子
boilingJiaoZi();
}
/**
做馅料(抽象,交由子类实现)
**/
public JiaoZi doFillings();
/**
包饺子
**/
public JiaoZi makeJiaoZi(){
System.out.println("饺子包好了");
}
/**
煮饺子
**/
public JiaoZi boilingJiaoZi(){
System.out.println("饺子煮好了,上菜。");
}
}
/**
饺子类的基类
**/
public class JiaoZi {
private String[] fillings();
}
/**
韭菜鸡蛋饺子
**/
public class JiuCaiJiDanJiaoZi{
}
/**
韭菜虾仁饺子
**/
public class JiuCaiXiaRenJiaoZi{
}
/**
牛肉饺子
**/
public class NiuRouJiaoZi{
}
/**
韭菜鸡蛋饺子工厂
**/
public JiuCaiJiDanJiaoZiFactory extends JiaoZiFactory{
public JiaoZi doFillings(){
fillings.add("韭菜");
fillings.add("鸡蛋");
}
}
/**
韭菜虾仁饺子工厂
**/
public JiuCaiXiaRenFactory extends JiaoZiFactory{
public JiaoZi doFillings(){
fillings.add("韭菜");
fillings.add("虾仁");
}
}
/**
牛肉饺子工厂
**/
public NiuRouFactory extends JiaoZiFactory{
public JiaoZi doFillings(){
fillings.add("牛肉");
fillings.add("洋葱");
}
}
public class Test{
public static void main(String[]args){
JiaoZiFactory factory = new NiuRouFactory();
factory.orderJiaoZi();
}
}
以下是针对饺子原材料进行的抽象工厂的设计。
/**
制作饺子需要2种原材料
皮/馅料
下面是饺子的工厂类设计
**/
public class JiaoZiFactory{
// 把原料工厂当作一个属性,提供接口 利用组合的方式
private YuanLiaoFactory yuanLiaoFactory;
// 工厂的创建指定不同的原料工厂
public JiaoZiFactory (YuanLiaoFactory yuanliaoFactory){
this.yuanLiaoFactory = yuanLiaoFactory;
}
// 获取饺子
public JiaoZi orderJiaozi(){
Jiaozi jiaozi = new Jiaozi();
jiaozi = yuanLiaoFactory.createPi();
jiaozi = yuanLiaoFactory.createXian();
return jiaozi;
}
}
/**
制作饺子原料的工厂
**/
public interface yuanLiaoFactory(){
// 制造皮的方法
JiaoZi createPi(Jiaozi jiaozi);
// 制造馅料的方法
JiaoZi createXian(Jiaozi jiaozi);
}
/**
南方饺子工厂
**/
public class NanJiaoZiFactory(){
public JiaoZi createPi(Jiaozi jiaozi){
jiaozi.setPi("南方饺子皮");
}
public JiaoZi createXian(Jiaozi jiaozi){
jiaozi.setXian("南方饺子馅料");
}
}
/**
北方饺子工厂
**/
public class BeiJiaoZiFactory(){
public JiaoZi createPi(Jiaozi jiaozi){
jiaozi.setPi("北方饺子皮");
}
public JiaoZi createXian(Jiaozi jiaozi){
jiaozi.setXian("北方饺子馅料");
}
}
/**
饺子实体类
**/
public class JiaoZi{
// 皮
private String Pi;
// 馅料
private String Xian;
// 省略get,set
}
public class Test{
public static void main(String[]agrs){
// 饺子工厂(南饺子原料)
JiaoZiFactory factory = new JiaoZiFactory(new NanJiaoZiFactory());
// 南饺子
JiaoZi jiaozi1 = factory.orderJiaozi();
// 更换原料工厂(北饺子原料)
factory = new JiaoZiFactory(new BeiJiaoZiFactory());
// 北饺子
JiaoZi jiaozi2 = factory.orderJiaozi();
}
}
总结:虽然工厂模式和抽象工厂模式有很多类似之处。都是为了将对象解耦。工厂模式使用的是继承的方式,实现对象的解耦,而抽象工厂模式是使用组合的方式进行对象的解耦。工厂模式适用于某个产品,而抽象工厂适用于某个产品家族,他们还是有很多区别的。