设计模式【04】——抽象工厂模式

目录

一、抽象工厂模式

1、简介

2、抽象工厂模式的优缺点

2.1 抽象工厂模式的优点

2.2 抽象工厂模式的缺点

3、抽象工厂模式的使用注意事项

3.1 使用场景

3.2 注意事项

二、工厂方法模式


 

书接上回,策略模式最好跟其他模式等结合起来进行混编,弥补策略类膨胀和对外暴露的问题。实际项目中,一般通过工厂方法模式来实现策略类的声明,那么就来学一下工厂模式。

一、抽象工厂模式

1、简介

类比奢侈品店,有一个抽象工厂用来生产迪奥和香奈儿产品,具体的香水柜台,就卖香奈儿和迪奥的香水,具体的包包柜台就卖这两家的包包。

  • AbstractFactory一个抽象工厂类,有几个产品族,抽象工厂类中就有N个产品的创建方法。如创建香奈儿产品、创建迪奥产品,会有具体的实现类:包包工厂类、香水工厂类
  • AbstractChaneProd,香奈儿抽象产品类,会有包包和香水实现类
  • AbstractDiorProd,迪奥抽象产品类,会有具体的包包和香水实现类
  • 测试场景:定义俩柜台,分别让他们出两种包包和香水即可,无须关心具体的实现类。

抽象工厂模式:提供一个创建一组对象(相关或者相互依赖)的接口,无须指定具体类

设计模式【04】——抽象工厂模式_第1张图片

 

/**
 * @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 注意事项

  • 产品族扩展难,但是产品类型扩展很容易,就是拉新品牌写代码多,但是增加一个迪奥唇膏就没那么难了

 

 

你可能感兴趣的:(设计模式)