java设计模式--工厂设计

本文深入解析工厂模式的三种形态:简单工厂、工厂方法和抽象工厂。通过实例代码详细讲解每种模式的特点、优缺点及适用场景。

工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类。

工厂模式主要用以下三种形态:
1:简单工厂(Simple Factory)。
2:工厂方法(Factory Method)。
3:抽象工厂(Abstract Factory)。

一、简单工厂:
       又叫静态工厂,是工厂模式三中状态中结构最为简单的。主要有一个静态方
法,用来接受参数,并根据参数来决定返回实现同一接口的不同类的实例。
1)先定义一个接口
public interface Product{} 
2)工厂产品实现该接口
public class Washer implements Product{  
   public Washer(){  
       System.out.println("洗衣机被制造了");  
   }  
}   
public class Icebox implements Product{  
   public Icebox(){  
       System.out.println("冰箱被制造了");  
   }  
}   
public class AirCondition implements Product{  
   public Icebox(){  
       System.out.println("空调被制造了");  
   }  
}  
3)工厂类,负责生产以上产品
public class SimpleFactory {      
    public static Product factory(String productName) throws Exception{  
        switch(productName){
    case Washer:return new Washer();
    case Icebox:return new Icebox();
    case AirCondition:return AirCondition();
    default:throw new Exception("没有该产品");


    }  
}

二、工厂方法
      工厂方法为工厂类定义了接口,用多态来削弱了工厂类的职能
1)工厂接口
public interface Factory{  
  public Product create();  
}  
2)产品接口
public interface Product{}
3)产品接口的产品类
public class Washer implements Product{  
   public Washer(){  
       System.out.println("洗衣机被制造了");  
   }  
}  
  
public class Icebox implements Product{  
   public Icebox(){  
       System.out.println("冰箱被制造了");  
   }  
}  
  
public class AirCondition implements Product{  
   public Icebox(){  
       System.out.println("空调被制造了");  
   }  
}  
4)具体创建产品对象的具体工厂类
public class CreateWasher implements Factory{  
    public Product create(){  
          return new Washer();  
    }  
}   
//创建冰箱的工厂  
public class CreateIcebox implements Factory{  
    public Product create(){  
          return new Icebox();  
    }  
}  
//创建空调的工厂  
public class CreateAirCondition implements Factory{  
    public Product create(){  
          return new AirCondition();  
    }  
}  
    从上面创建产品对象的代码可以看出,工厂方法和简单工厂的主要区别是,简单工厂
是把创建产品的职能都放在一个类里面,
    优点:工厂方法则把不同的产品放在实现了工厂接口的不同工厂类里面,这样就算其
中一个工厂类出了问题,其他工厂类也能正常工作,互相不受影响,以后增加新产品,也
只需要新增一个实现工厂接口工厂类,就能达到,不用修改已有的代码。
    缺点:但工厂方法也有他局限的地方,那就是当面对的产品有复杂的等级结构的时候
,例如,工厂除了生产家电外产品,还生产手机产品,这样一来家电是手机就是两大产品
家族了,这两大家族下面包含了数量众多的产品,每个产品又有多个型号,这样就形成了
一个复杂的产品树了。如果用工厂方法来设计这个产品家族系统,就必须为每个型号的产
品创建一个对应的工厂类,当有数百种甚至上千种产品的时候,也必须要有对应的上百成
千个工厂类,这就出现了传说的类爆炸,对于以后的维护来说,简直就是一场灾难.....

三、抽象工厂
       抽象工厂:意的意图在于创建一系列互相关联或互相依赖的对象。工厂方法用来创建一个产品,它没有分类的概念,而抽象工厂则用于创建一系列产品,所以产品分类成了抽象工厂的重点。
1)产品分类接口 
//洗衣机接口  
public interface Washer{  
}   
//冰箱接口  
public interface Icebox{  
}
2)上面两个接口的具体产品
//洗衣机-A  
public class WasherA implements Washer{  
   public WasherA(){  
       System.out.println("洗衣机-A被制造了");  
   }  
}   
//洗衣机-B  
public class WasherB implements Washer{  
   public WasherB(){  
       System.out.println("洗衣机-B被制造了");  
   }  
}
//冰箱-A  
public class IceboxA implements Icebox{  
   public IceboxA(){  
       System.out.println("冰箱-A被制造了");  
   }  
}  
//冰箱-B  
public class IceboxB implements Icebox{  
   public IceboxB(){  
       System.out.println("冰箱-B被制造了");  
   }  
}  
3)工厂部分,工厂行为接口
public interface Factory{  
       public Washer createWasher();  
       public Icebox createIcebox();  

4)实现具体工厂
//创建型号为A的产品工厂  
public class FactoryA implements Factory{  
       //创建洗衣机-A  
       public Washer createWasher(){  
            return new WasherA();  
       }  
  
       //创建冰箱-A  
       public Icebox createIcebox(){  
            return new IceboxA();  
       }  
}   
//创建型号为B的产品工厂  
public class FactoryB implements Factory{  
       //创建洗衣机-B  
       public Washer createWasher(){  
            return new WasherB();  
       }  
       //创建冰箱-B  
       public Icebox createIcebox(){  
            return new IceboxB();  
       }  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值