浅谈工厂和建造者模式

最近在写安卓项目,在引入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 parts = new ArrayList();
     
    //用于将组件组装到汽车里
    public void Add(String part){
    parts.add(part);
}
    
    public void Show(){
          for (int i = 0;i

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抽象工厂和建造者模式的区别

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

你可能感兴趣的:(浅谈工厂和建造者模式)