设计模式之(工厂)

1、简单工厂模式

 简单工厂模式又称为静态工厂方法模式。 他的目的很简单,定义一个用于创建对象的接口

组成:

1)工厂类角色

2)抽象产品角色

3)具体产品角色

//抽象产品角色

public interface Car{
  public void drive();
}

//具体产品角色

public class Benz implements Car{
  public void drive() {
    System.out.println("Driving Benz ");
  }
}
public class Bmw implements Car{
  public void drive() {
    System.out.println("Driving Bmw ");
  }
}

//工厂类角色

public class Driver{
//工厂方法.注意返回类型为抽象产品角色
  public static Car driverCar(String s)throws Exception {
    //判断逻辑,返回具体的产品角色给Client
      if(s.equalsIgnoreCase("Benz"))
        return new Benz();
       else if(s.equalsIgnoreCase("Bmw"))
        return new Bmw();
        ......
       else throw new Exception();
。。。

//欢迎暴发户出场......
public class Magnate{
  public static void main(String[] args){
    try{
      //告诉司机我今天坐奔驰
      Car car = Driver.driverCar("benz");
      //下命令:开车
      car.drive();
      。。。

 

 

 

首先,使用了简单工厂模式后,我们的程序不在“有病”,更加符合现实中的情况;而且
客户端免除了直接创建产品对象的责任,而仅仅负责“消费”产品(正如暴发户所为)。

下面我们从开闭原则(对扩展开放;对修改封闭)上来分析下简单工厂模式。当暴发户
增加了一辆车的时候,只要符合抽象产品制定的合同,那么只要通知工厂类知道就可以被客
户使用了。所以对产品部分来说,它是符合开闭原则的;但是工厂部分好像不太理想,因为
每增加一辆车,都要在工厂类中增加相应的业务逻辑或者判断逻辑,这显然是违背开闭原则
的。可想而知对于新产品的加入,工厂类是很被动的。对于这样的工厂类(在我们的例子中
是为司机师傅),我们称它为全能类或者上帝类。

2、工厂方法模式

工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承

1)抽象工厂角色

2)具体工厂角色

3)抽象产品角色

4)具体产品角色

//抽象产品角色,具体产品角色与简单工厂模式类似,只是变得复杂了些,这里略。
//抽象工厂角色
public interface Driver{
public Car driverCar();
}
public class BenzDriver implements Driver{
public Car driverCar(){
return new Benz();
}
}
public class BmwDriver implements Driver{
public Car driverCar() {
return new Bmw();
}
}
//应该和具体产品形成对应关系...
//有请暴发户先生
public class Magnate
{
public static void main(String[] args)
{
try{
Driver driver = new BenzDriver();
Car car = driver.driverCar();
car.drive();
}
……

可以看出工厂方法的加入,使得对象的数量成倍增长。当产品种类非常多时,会出现大
量的与之对应的工厂对象,这不是我们所希望的。因为如果不能避免这种情况,可以考虑使
用简单工厂模式与工厂方法模式相结合的方式来减少工厂类:即对于产品树上类似的种类
(一般是树的叶子中互为兄弟的)使用简单工厂模式来实现。

3、抽象工厂

 

posted on 2016-05-03 15:48  yanran  阅读(158)  评论(0编辑  收藏  举报