目录
扫描二维码关注公众号,回复:
12727308 查看本文章
书接上回,策略模式最好跟其他模式等结合起来进行混编,弥补策略类膨胀和对外暴露的问题。实际项目中,一般通过工厂方法模式来实现策略类的声明,那么就来学一下工厂模式。
一、抽象工厂模式
1、简介
类比奢侈品店,有一个抽象工厂用来生产迪奥和香奈儿产品,具体的香水柜台,就卖香奈儿和迪奥的香水,具体的包包柜台就卖这两家的包包。
- AbstractFactory一个抽象工厂类,有几个产品族,抽象工厂类中就有N个产品的创建方法。如创建香奈儿产品、创建迪奥产品,会有具体的实现类:包包工厂类、香水工厂类
- AbstractChaneProd,香奈儿抽象产品类,会有包包和香水实现类
- AbstractDiorProd,迪奥抽象产品类,会有具体的包包和香水实现类
- 测试场景:定义俩柜台,分别让他们出两种包包和香水即可,无须关心具体的实现类。
抽象工厂模式:提供一个创建一组对象(相关或者相互依赖)的接口,无须指定具体类
/**
* @name: AbstractFactory.class
* @Author :
* @create : 2020-07-08
* @Desc: 抽象工厂类,有多少个产品族,在抽象工厂类中就有N个创建方法
*/
public abstract class AbstractFactory {
//创建香奶奶系列
public abstract AbstractChanelProd createChanelProd();
//创建迪奥系列
public abstract AbstractDiorProd createDiorProd();
}
/**
* @name: BagFactory.class
* @Author :
* @create : 2020-07-08
* @Desc: 包包工厂的实现类
*/
public class BagFactory extends AbstractFactory {
@Override
public AbstractChanelProd createChanelProd() {
return new ChanelBagProd();
}
@Override
public AbstractDiorProd createDiorProd() {
return new DiorBagProd();
}
}
/**
* @name: PerfumeFactory.class
* @Author :
* @create : 2020-07-08
* @Desc: 香水工厂的实现类
*/
public class PerfumeFactory extends AbstractFactory {
@Override
public AbstractChanelProd createChanelProd() {
return new ChanelPerfumeProd();
}
@Override
public AbstractDiorProd createDiorProd() {
return new DiorPerfumeProd();
}
}
/**
* @name: AbstractChanelProd.class
* @Author :
* @create : 2020-07-08
* @Desc: 香奈儿抽象产品类
*/
public abstract class AbstractChanelProd {
public abstract void sayChanel();
}
/**
* @name: AbstractDiorProd.class
* @Author :
* @create : 2020-07-08
* @Desc: 迪奥商品的抽象类
*/
public abstract class AbstractDiorProd {
public abstract void sayDior();
}
/**
* @name: ChanelProduct.class
* @Author :
* @create : 2020-07-08
* @Desc: 香奈儿包包实现类
*/
public class ChanelBagProd extends AbstractChanelProd {
@Override
public void sayChanel() {
System.out.println("我是香奶奶包包");
}
}
/**
* @name: ChanelPerfumeProd.class
* @Author :
* @create : 2020-07-08
* @Desc: 香奈儿香水的实现类
*/
public class ChanelPerfumeProd extends AbstractChanelProd {
@Override
public void sayChanel() {
System.out.println("我是香奈儿香水!");
}
}
/**
* @name: DiorBagProd.class
* @Author :
* @create : 2020-07-08
* @Desc: 迪奥包包实现类
*/
public class DiorBagProd extends AbstractDiorProd{
@Override
public void sayDior() {
System.out.println("我是迪奥包包");
}
}
/**
* @name: DiorPerfumeProd.class
* @Author :
* @create : 2020-07-08
* @Desc: 迪奥产品抽象类的实现类
*/
public class DiorPerfumeProd extends AbstractDiorProd {
@Override
public void sayDior() {
System.out.println("我是迪奥香水!");
}
}
/**
* @name: Store.class
* @Author :
* @create : 2020-07-08
* @Desc: 商店测试类
*/
public class Store {
public static void main(String[] args) {
//定义俩工厂
AbstractFactory bagFactory = new BagFactory();
AbstractFactory perfumeFactory = new PerfumeFactory();
//进货香奈儿、迪奥的包包和香水
AbstractChanelProd chanelBag = bagFactory.createChanelProd();
AbstractChanelProd chanelPerfume = perfumeFactory.createChanelProd();
//没有一个方法与实现类有关,都是抽象商品类
//只要知道工厂就能生产一个产品,无须关心实现类
AbstractDiorProd diorBag = bagFactory.createDiorProd();
AbstractDiorProd diorPerfume = perfumeFactory.createDiorProd();
chanelBag.sayChanel();
chanelPerfume.sayChanel();
diorBag.sayDior();
diorPerfume.sayDior();
}
}
2、抽象工厂模式的优缺点
2.1 抽象工厂模式的优点
- 封装性:不关心产品的实现细节,只要知道工厂和抽象产品类,就能造一个对象,省时省力
- 产品族内的约束为非公开状态,在factory内实现,比如香水factory的生产香水方法,内部可能会有一些约束条件。
2.2 抽象工厂模式的缺点
- 扩展很难,违反了开闭原则,改抽象类,实现类也得改。
3、抽象工厂模式的使用注意事项
3.1 使用场景
一个对象族都有相同的约束,就可以使用抽象工厂模式。
比如:文本编辑器和图片处理器都有相同的约束:操作系统,就可以使用抽象工厂模式,产生不同操作系统下的应用。
3.2 注意事项
- 产品族扩展难,但是产品类型扩展很容易,就是拉新品牌写代码多,但是增加一个迪奥唇膏就没那么难了