创建型模式之工厂方法模式(FactoryMethod)

工厂方法模式:

又叫虚拟构造(virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式。它的正式定义为:工厂方法模式定义一个创建对象的接口,

    但是由子类决定要实例化的类是哪一个,工厂方法让类的实例化推迟到了子类。

    工厂方法模式结构有:抽象工厂,具体工厂,抽象产品,具体产品组成。

    抽象工厂是工厂方法模式的核心,它是与应用程序无关,任何在模式中创建对象的工厂类必须实现这一个接口。在实际的系统中,这个角色也常常用Java抽象类实现。
    具体工厂是实现抽象工厂的Java类实现。
    抽象产品是工厂方法模式创建的对象的超类,也就是产品对象共同的父类或共同拥有的接口。

    具体产品是实现抽象产品角色所声明的接口。

意图:定义一个用于创建对象的接口,并控制返回哪个对象的实例。让服务的提供者确定实例化哪个类,而不是客户端。在Java类库中极为常见,比如Collection
            中的iterator()方法。
 优势
             在开发的过程中,工厂方法通过使用产品的接口去实现功能,并且其实现任务可以延迟到子类中完成。
             添加新产品无需修改接口;
             隔断了客户端和具体产品的依赖关系,提高了产品的可扩展性。
 应用场所:
            当客户端程序不了解调用几个类进行实例化时,可以用工厂方法模式建立一个接口,用于控制一些类进行实例化。
            当父类考虑使用子类去实例化对象时,
            当一个类不清楚它需要建立的对象类时,可以用子类来实现。
  与spring:
      spring框架的factoryBean接口体现了工厂方法模式应用。
      factoryBean是抽象工厂,ProxyFactoryBean、TimerFactoryBean是具体工厂。
      Object是抽象产品,AopObject、Timer是具体产品。

实例:比如某公司即在生产上提出技术革新,又能尽职尽责。因此,被两次评为先进个人。
抽象工厂---公司

public interface ICompany
{
	Person createPerson();
}

具体工厂--公司表扬1
public class PraiseOneCompany implements ICompany
{
  public Person createPerson()
  {
  reuturn new PraiseOne();
  }
}

具体工厂---公司表扬2
public class PraiseTwoCompany implements ICompany
{
   public Person createPerson()
  {
    return new PraiseTwo();
  }
}

抽象产品--员工
public interface Person
{
 public void skillOne();
 public void skillTwo();
 public void industry();
}

具体产品--表扬1
public class praiseOne implements Person
{
   public void skillOne()
   {
     //
   }
   public void skillTwo()
   {
     //
    }
   public void industry()
   {
    //
   }

}
具体产品--表扬2
public class praiseTwo implements Person
{
   public void skillOne()
  {
    //
   }
  public void skillTwo()
  {
    //
   }
   public void industry()
   {
   //
   }

}
测试类
public class TestClient
{
      ICompany oneCompany = new PraiseOneCompany();
      Person personeOne = oneCompany.createPerson();
      System.out.println("jerry:"+personeOne.skillOne()+"   \n"+personeOne.skillTwo()+"\n"+personeOne.industry());
      ICompany twoCompany = new PraiseTwoCompany();
       Person personeTwo = twoCompany.createPerson();
       System.out.println("tom:"+personeTwo.skillOne()+"   \n"+personeTwo.skillTwo()+"\n"+personeTwo.industry());
} 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值