简单软件应用场景:
多个外观不同的按钮,这些按钮都源于 同一个 基类
在继承基类后不同的子类修改了部分属性从而使得它们可以呈现不同的外观。
如果我们希望在使用这些按钮时,
不需要知道这些 具体按钮类 的名字,只需要知道表示该按钮类的一个参数,并提供一个调用方便的方法,把该 参数 传入方法计科返回一个相应的按钮对象
此时,就可以使用简单工厂模式。
模式定义
简单工厂模式(Simple Factory pattern),属于创建型模式。在简单工厂模式中,可以根据 参数 的不同返回 不同 类 的实例。 简单工厂模式专门 定义一个 类 来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
模式结构
角色
- Factory:工厂角色
- Product:抽象产品角色
- ConcreteProduct:具体产品角色
实例一:简单电视机工厂
*某电视机厂专为各知名电视机品牌代工生产各类电视机,当需要 海尔牌 电视机时只需要再调用该工厂的工厂方法时传入参数“Haier”,需要海信电视机时只需要传入参数“Hisense”,工厂可以根据传入的不同参数返回不同品牌的电视机。
模式结构
TV.java
public interface TV {
public void play();
}
Haier.java
public class HaierTV implements TV {
@Override
public void play() {
System.out.println("海尔电视机播放中……");
}
}
Hisense.java
public class HisenseTV implements TV {
@Override
public void play() {
System.out.println("海信电视机播放中……");
}
}
TVFactory.java
public class TVFactory {
public static TV produceTV(String brand) throws Exception{
if(brand.equalsIgnoreCase("Haier")) {
System.out.println("电视机工厂生产海尔电视机");
return new HaierTV();
}
else if(brand.equalsIgnoreCase("Hisense")) {
System.out.println("电视机工厂生产海信电视机");
return new HisenseTV();
}
else
{
throw new Exception("对不起,暂不能生产该品牌电视机!");
}
}
}
configTV.xml
<?xml version="1.0" encoding="UTF-8"?>
<config>
<brandName>hisense</brandName>
</config>
TVFactory.java
public class TVFactory {
public static TV produceTV(String brand) throws Exception{
if(brand.equalsIgnoreCase("Haier")) {
System.out.println("电视机工厂生产海尔电视机");
return new HaierTV();
}
else if(brand.equalsIgnoreCase("Hisense")) {
System.out.println("电视机工厂生产海信电视机");
return new HisenseTV();
}
else
{
throw new Exception("对不起,暂不能生产该品牌电视机!");
}
}
}
client.java
public class Client {
public static void main(String[] args) {
try {
TV tv;
String brandName = XMLUtilTV.getBrandName();
tv = TVFactory.produceTV(brandName);
tv.play();
}
catch(Exception e) {
System.out.println(e.getMessage());
}
}
}