走进设计模式的世界4:我不是你,但是大家都把我当成你-工厂模式和抽象工厂模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 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();
    }
}

总结:虽然工厂模式和抽象工厂模式有很多类似之处。都是为了将对象解耦。工厂模式使用的是继承的方式,实现对象的解耦,而抽象工厂模式是使用组合的方式进行对象的解耦。工厂模式适用于某个产品,而抽象工厂适用于某个产品家族,他们还是有很多区别的。

猜你喜欢

转载自blog.csdn.net/qq_35165632/article/details/83750534