简单工厂模式
简单工厂模式,属于类的创新型模式,又称静态工厂方法模式,使通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
模式动机
设想软件开发场景中,客户端需要创建和使用不同品牌的电视机对象,这些不同的电视机品牌都源自同一个电视抽象类。客户端只需要知道电视机品牌名称并提供一个调用方法,然后把参数传入就可以返回一个电视机对象,从而实现电视机对象的创建与使用分离。
模式结构及角色分析
简单工厂模式类图如下:
简单工厂模式类图中包含实现关系和依赖关系,如上图所示。
角色1:抽象产品Product为产品的接口。
角色2:具体产品ConcreteProduct为Product的实现类。
角色3:工厂Factory可以提供创建产品对象的静态方法。
模式实现
程序代码如下:
(1)ITelevision接口
package television;
public interface ITelevision {
//角色1:抽象产品
public abstract void product();
}
(2)HaierTelevison类
package television;
public class HaierTelevison implements ITelevision{
@Override
public void product() {
// 角色2:具体产品
System.out.println("海尔电视机生产了。。。");
}
}
(3)HisenseTelevison类
package television;
public class HisenseTelevison implements ITelevision {
@Override
public void product() {
// 角色2:具体产品
System.out.println("hisense电视生产了。。。。");
}
}
(4)TelevisionFactory类
package television;
//简单工厂模式练习
public class TelevisionFactory {
//角色3:工厂类
//生产某种品牌的静态方法
public static ITelevision productTelevision(String name) throws InstantiationException, IllegalAccessException {
if (name.equalsIgnoreCase("Haier")) {
return HaierTelevison.class.newInstance();
} else if (name.equalsIgnoreCase("Hisense")) {
return HisenseTelevison.class.newInstance();
} else {
System.out.println("找不到相应的实例化类。。。");
return null;
}
}
}
(5)FactoryTest类
package television;
public class FactoryTest {
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
ITelevision haier=TelevisionFactory.productTelevision("haier");
ITelevision hisense=TelevisionFactory.productTelevision("hisense");
if(haier!=null){
haier.product();
}
if(hisense!=null){
hisense.product();
}
}
}
模式评价
在简单工厂模式中,核心类Factory类只负责产品的创建(提供静态方法),调用者不必知道产品的创建细节,这符合单一职责原则。如果不使用工厂类,那么调用者不仅需要知道接口,还需要知道其实现类。
简单工厂模式存在的问题:当增加新产品时,需要修改工厂类。这将在工厂模式中得到解决。