java设计模式-工厂模式

13 篇文章 0 订阅

intent

•Define an interface for creating an object, but letsubclasses decide which class to instantiate. Factory Method lets a class deferinstantiation to subclasses.
•为创建对象创建一个接口,使得创建哪一个对象让子类来干。
 

Applicability

•a class can't anticipate the class of objects it mustcreate.
•一个类不确定他所必须创建的对象中的哪一个。
•A class wants its subclasses to specify the objects itcreates
•一个类需要他的子类来确定创建哪一种对象。
•classes delegate responsibility to one of several helpersubclasses, and you want to localize the knowledge of which helper subclass isthe delegate.
•将创建哪一个对象的职能委托给子类,并且希望这些职能集中委托给一个子类。
 
 

Consequences

•在工厂方法内部生成对象要比直接生成对象更灵活。
•连接平行的类层次关系。
 

UML

工厂方法与简单工厂相比有何区别?
•多了一个工厂方法的接口。
•工厂方法可以支持多态,意味着将创建哪一个对象推迟到了子类。
 

Example --- iterator

Collection接口里有一个方法Iterator,ArrayList、LinkedList实现此接口,对于ArrayList和LinkedList都会返回各自的Iterator对象。

对于此Collection.iterator方法就是工厂方法。

而ArrayList和LinkedList返回具体的产品。

 

对于上述,JDK中和此不一样,在此主要是抽象出来用于讲解,细节方法可以阅读JDK中的源码,理清之间的关系。

另外Iterator是迭代模式。

 
•Collection.Iterator()是工厂方法角色
•Collection是抽象Creator角色。
•Iterator是抽象产品角色。
•Itr(可查阅jdk源码)是具体产品角色。(实际上在Itr中用到了模板方法模式,有兴趣可以查阅源码进行分析)。
 

Example -- toString

•对象信息字串会根据自身的需求来进行拼凑组合。等同于将toString创造的对象信息字串推迟在了子类中实现。
•toString就是FactoryMethod。
•Object就是抽象Creator。
•toString返回的String对象就是产品。
工厂方法与五项基本原则
 
•符合开闭原则。
•当多个产品等级结构出现时,工厂方法经无法满足需求。


 

工厂方法模式应用场景举例

比如在玩“极品飞车”这款游戏,晕了吧,我喜欢极品飞车:),在玩这款游戏时,游戏者可以选择从不同品牌来选择赛车,那么这个“品牌”其实也就是工厂,每个工厂生产的赛车都不一样,这就是典型的工厂方法的应用场景。

工厂方法模式解释

类型:创建模式

定义一个用于创建对象的接口,让其子类来决定实例化哪一个类(产品),工厂方法使一个类的创建延迟到其子类中。

工厂方法模式UML图

工厂方法模式-JAVA代码实现

新建车的接口:

public interface CAR {
       public void start();
       public void stop();
    }

新建1个汽车信息的基类:

 

public class CAR_CALSS implements CAR {

 private String carname;
 int speed;
 
 public String getName(){
  return carname;
 }
 public void setName(String carname){
  this.carname = carname;
 }
 
 public int getSpeed() {
  return speed;
 }
 public void setSpeed(int speed) {
  this.speed = speed;
 }
 
 @Override
 public void start() {
  // TODO Auto-generated method stub

}

@Override
 public void stop() {
  // TODO Auto-generated method stub

}

}

新建奥迪汽车实现类:
public class CAR_CALSS_AUDI extends CAR_CALSS {

public void start(){
  System.out.println("我是奥迪;"+this.getName()+"启动了,速度为"+this.getSpeed());
 }
 
 public void stop(){
  System.out.println("我是奥迪;"+this.getName()+"停止了");
 }
}

新建大众汽车实现类:

 

public class CAR_CALSS_3W extends CAR_CALSS {
 public void start(){
  System.out.println(this.getName()+"启动了,速度为"+this.getSpeed());
 }
 
 public void stop(){
  System.out.println(this.getName()+"停止了");
 }
}

 

新建一个汽车工厂接口:

 

public interface CAR_FACTORY {
  public CAR create_car();
}

 新建一个创建奥迪车的汽车工厂实现类:

 

public class CAR_FACTORY_AUDI implements CAR_FACTORY {

@Override
 public CAR create_car() {
  CAR_CALSS_AUDI car_audi_imp  = new CAR_CALSS_AUDI();
  car_audi_imp.setName("奥迪A6");
  car_audi_imp.setSpeed(200);
  return car_audi_imp;
 }

}

 

新建一个创建大众车的汽车工厂实现类:

 

public class CAR_FACTORY_3W implements CAR_FACTORY {

@Override
 public CAR create_car() {
  CAR_CALSS_3W car_3w_imp  = new CAR_CALSS_3W();
  car_3w_imp.setName("上海大众passt");
  car_3w_imp.setSpeed(200);
  return car_3w_imp;
 
 }

}

 

客户端运行程序代码:

 

public class RUN_MAIN {


 public static void main(String[] args) {
  // TODO Auto-generated method stub
      CAR_FACTORY_AUDI factory_audi = new CAR_FACTORY_AUDI();
      CAR  car_ref  = factory_audi.create_car();
      car_ref.start();
      car_ref.stop();
 }

}

 

 

通过使用工厂方法模式就可以将对象的创建延迟到子类进行实例化,而且每个工厂创建不同的品牌的汽车,每个汽车的功能都有自己“专利”的实现,这样可以将不同“品牌”的“汽车”的创建进行分类,有利于对象创建的清晰性。创建不同的汽车只需要改动这句代码就可以了:

 CAR_FACTORY_AUDI factory_audi = new CAR_FACTORY_AUDI();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值