浅谈工厂和建造者模式

最近在写安卓项目,在引入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抽象工厂和建造者模式的区别

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容