美文网首页
浅谈工厂和建造者模式

浅谈工厂和建造者模式

作者: 月影角鳄 | 来源:发表于2019-05-03 22:37 被阅读0次

    最近在写安卓项目,在引入rxJava和Retrofit发现大量引用的建造者模式。那在此就记录和简单介绍一下两者的区别和使用方法。
    工厂模式和建造者模式都属于创建型模式,它对类的实例化进行了抽象。

    1、1 工厂模式

    工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。

    1、2 应用场景

    1. 对象的创建过程/实例化准备工作很复杂,需要初始化很多参数、查询数据库等。

    2.类本身有好多子类,这些类的创建过程在业务中容易发生改变,或者对类的调用容易发生改变。
    举个例子:自主创建需要的产品对象(小米和苹果),达到增加新产品时无需修改其他具体的工厂和具体类的目的。

    1.3 工厂模式代码

         /**
          * 手机接口
          * @author li
          */
         public  interface Moblie{
             //  TODO 
         }
         /**
          * 手机工厂接口
          * @author li
          */
         public interface MobileFactor{
             public Moblie productMobile();
         }
    
         public class iphone implements Moblie {
             // TODO
         }
         
         public class Mi implements Moblie {
             // TODO
         }
         
         public class MotorolaFactor implements MobileFactor {
     
            @Override
            public Moblie productMobile() {
                return new iphone ();
            }
         }
         
         public class NokiaFactor implements MobileFactor {
     
            @Override
            public Moblie productMobile() {
                return new Mi();
            }
         }
    

    主类:

         public static void main(String[] args) {
             MobileFactor mf = new MI Factor(); // 需要什么产品就创造什么工厂
             Moblie m;
             m = mf.productMobile();
         }
    

    1、4抽象工厂的使用

    1.4.1 定义接口

         public abstract class ComputerFactor{
             CPU cpu;
             HardDisk hd;
             MainBoard mb;
             
             public void show() {
                 //  利用传进来的组件做事
             }
         }
    

    1.4.3 实现类

         public class IBM extends ComputerFactor {
             public IBM() {
                cpu = new AMD();
                hd = new Maxtor();
                mb = new MSIK7N2G();
            }
         }
    

    1.4.3主类

             public static void main(String[] args) {
             IBM ibm = new IBM();
             ibm.show();
         }
    

    1.4.4 抽象工厂优缺点

    抽象工厂模式与工厂方法模式最大的区别在于:工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则针对的是多个产品等级结构。
    优点:抽象工厂模式同样具备隔离具体类生成。并且当一个产品族中的多个对象设计成一起工作时,他能够保证客户端始终只使用同一个产品族中的对象。
    缺点:再添加新的产品对象时,难以扩展抽象工厂模式以便产生新种类产品。
    然后比较最多的应该就是抽象工厂和建造者模式,下面就简单介绍一下建造者模式。

    2、1建造者模式

    建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
    一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。

    2.2应用场景

    1、需要生成的对象具有复杂的内部结构。
    2、需要生成的对象内部属性本身相互依赖。
    举个例子:1、工厂(建造者模式):负责制造汽车(组装过程和细节在工厂内)
    2、汽车购买者(用户):你只需要说出你需要的型号(对象的类型和内容),然后直接购买就可以使用了
    (不需要知道汽车是怎么组装的(车轮、车门、发动机、方向盘等等))

    2、3 建造者模式代码

    示例分析:
    1、小高定制买车,老板(Diretor)和小高(Client)进行需求沟通(越野?日常?撩妹?)
    2、了解需求后,电脑城老板将小高需求划分为各个部件(Builder)的建造请求(发动机、车身、颜色)
    3、指挥装机人员(ConcreteBuilder)去构建组件;
    4、将组件组装起来成小高需要的汽车(Product)

    2、3、1定义组装过程(Builder):组装汽车的过程

    public  abstract class Builder {  
    
    //第一步:装发动机
        public abstract void  BuildEngine();
    //第二步:装车身
        public abstract void BuildBody();
    //第三步:车身颜色
        public abstract void BuildColor();
    //返回产品的方法:获得组装好的汽车
        public abstract Car GetCcar();
    }
    

    2、3、2 老板委派任务给组装人员(Director)

    public class Director{
                            //指挥装机人员组装电脑
                            public void Construct(Builder builder){
                                     builder. BuildEngine();
                                     builder.BuildBody();;
                                     builder. BuildColor();
                                  }
     }
    

    2、3、3创建具体的建造者(ConcreteBuilder):组装人员

    //装车人员
      public class ConcreteBuilder extend  Builder{
        //创建产品实例
        Car car = new Car();
    
        //组装产品
        @Override
        public void  BuildEngine(){  
           car.Add("组装发动机")
        }  
    
        @Override
        public void  BuildBody(){  
           car.Add("组装车身")
        }  
    
        @Override
        public void  BuildColor(){  
           car.Add("喷漆")
        }  
    
        //返回组装成功的汽车
         @Override
          public  Car GetCar(){  
          return car
        }  
    }
    

    2、3、4定义具体产品类(Product):汽车

    public class Car{
        
        //汽车组件的集合
        private List<String> parts = new ArrayList<String>();
         
        //用于将组件组装到汽车里
        public void Add(String part){
        parts.add(part);
    }
        
        public void Show(){
              for (int i = 0;i<parts.size();i++){    
              System.out.println(“组件”+parts.get(i)+“装好了”);
              }
              System.out.println(“组装完成,请验收”);
        }
    }
    

    2、3、5客户端调用-买车

    public class Builder Pattern{
      public static void main(String[] args){
    
    //逛了很久终于发现一家合适的汽车店
    //找到该店的老板和装机人员
      Director director = new Director();
      Builder builder = new ConcreteBuilder();
    
    //沟通需求后,老板叫装机人员去装电脑
    director.Construct(builder);
    
    //装完后,组装人员搬来组装好的电脑
    Car car = builder.GetCar();
    //组装人员展示电脑给小高看
    car.Show();
        }
    }
    

    2、4 建造模式优缺点

    优点:1、将产品本身与产品创建过程进行解耦,可以使用相同的创建过程来得到不同的产品。也就说细节依赖抽象。
    2、将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰。
    缺点:如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

    3抽象工厂和建造者模式的区别

    抽象工厂模式比建造者模式的尺度要大,它关注产品整体,而建造者模式关注构建过程,因此建造者模式可以很容易地构建出一个崭新的产品,只要导演类能够提供具体的工艺流程。也正因为如此,两者的应用场景截然不同,如果希望屏蔽对象的创建过程,只提供一个封装良好的对象,则可以选择抽象工厂方法模式。而建造者模式可以用在构件的装配方面,如通过装配不同的组件或者相同组件的不同顺序,可以产生出一个新的对象,它可以产生一个非常灵活的架构,方便地扩展和维护系统。

    相关文章

      网友评论

          本文标题:浅谈工厂和建造者模式

          本文链接:https://www.haomeiwen.com/subject/owaznqtx.html