简单工厂、工厂方法、抽象工厂简明总结

图例参考:

https://www.cnblogs.com/zhangchenliang/p/3700820.html

抽象工厂和工厂方法区别个人总结:

  • 抽象工厂中产品有产品族的概念,比如车辆类型族(运动型、舒适型),车辆品牌族(宝马、奔驰),族和族可以互相组合,所以抽象工厂中具体工厂可以以侧重点命名SportDriverBusinessDriver,然后在Sport里面用方法createBenzCar创建奔驰运动车,用createBmwCar创建宝马运动车,即是说它创建的是族的组合产品(一个工厂可能既奔驰运动车和宝马运动车就是族的组合产物)。
  • 工厂方法和抽象工厂区别就在于,它的工厂产品比较单一只有一个族,因此它的工厂实现类里面只生产这个族下产品就可以了,比如只有类型族,那么工厂实现类(比如奔驰车)里面就只需要生产奔驰车产品就可以了,即是说它只创建单一族产品(比如工厂1只生产宝马车,工厂2只生产奔驰车,宝马和奔驰就是品牌产品族的产品)。

简单工厂:

角色组成
  • 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑,根据逻辑不同,产生具体的工厂产品。如例子中的Driver类。
  • 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。由接口或者抽象类来实现。如例中的Car接口。
  • 具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现,如例子中的Benz、Bmw类。
图示

在这里插入图片描述

上代码
//简单工厂  
class Driver{  
    public static Car createCar(String car){  
        Car c = null;  
        if("Benz".equalsIgnoreCase(car))  
            c = new Benz();  
        else if("Bmw".equalsIgnoreCase(car))  
            c = new Bmw();  
        return c;  
    }  
}  

工厂方法:

角色组成
  • 抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
  • 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。
  • 抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
  • 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
图示

在这里插入图片描述

上代码
   //抽象工厂  
   abstract class Driver{  
       public abstract Car createCar(String car) throws Exception;  
   }  
   //具体工厂(每个具体工厂负责一个具体产品)  
   class BenzDriver extends Driver{  
       public Car createCar(String car) throws Exception {  
           return new Benz();  
       }  
   }  
   class BmwDriver extends Driver{  
       public Car createCar(String car) throws Exception {  
           return new Bmw();  
       }  
   } 
总结

厂方法模式中我们把生成产品类的时间延迟,就是通过对应的工厂类来生成对应的产品类,在这里我们就可以实现“开发-封闭”原则,无论加多少产品类,我们都不用修改原来类中的代码,而是通过增加工厂类来实现。但是这还是有缺点的,如果产品类过多,我们就要生成很多的工厂类。假如我们要实现的产品接口不止一个,也就是有多个产品接口,不同产品接口有对应的产品族。什么是产品族呢?简单的理解就是,不同牌子产的车里面会有跑车类型,家庭类型,商用类型等的车,不同牌子的车的跑车类型的车可以组成一个产品族。对于这种情况我们可以采用抽象工厂模式。

抽象工厂:

角色组成
  • 抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
  • 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。
  • 抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
  • 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
图示

在这里插入图片描述

源代码
	 //抽象工厂
    abstract class Driver3{  
        public abstract BenzCar createBenzCar(String car) throws Exception;  
          
        public abstract BmwCar createBmwCar(String car) throws Exception;  
          
        public abstract AudiCar createAudiCar(String car) throws Exception;  
    }  
    //具体工厂  
    class SportDriver extends Driver3{  
        public BenzCar createBenzCar(String car) throws Exception {  
            return new BenzSportCar();  
        }  
        public BmwCar createBmwCar(String car) throws Exception {  
            return new BmwSportCar();  
        }  
        public AudiCar createAudiCar(String car) throws Exception {  
            return new AudiSportCar();  
        }  
    }  
    class BusinessDriver extends Driver3{  
        public BenzCar createBenzCar(String car) throws Exception {  
            return new BenzBusinessCar();  
        }  
        public BmwCar createBmwCar(String car) throws Exception {  
            return new BmwBusinessCar();  
        }  
        public AudiCar createAudiCar(String car) throws Exception {  
            return new AudiBusinessCar();  
        }  
    }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值