什么是简单工厂模式
把实例化对象的责任交给一个特定的类负责,这个类就是工厂类,客户端将自己所需要的对象告诉工厂类,工厂类返回客户端所需要的对象。
简单工厂模式的角色
Factory:工厂类,负责实例化对象并返回
Product:抽象接口类,定义一组产品共同的行为
ConcreteProduct:具体产品类,用于实现具体的产品行为
下面我们简单实现一个实例,工厂有雷神和火麒麟两种武器,客户可以要求工厂生产这两种武器,客户可以选择购买这两样武器
Product接口:
package simplefactory;
/**
*
* @author lzy
*/
public interface Product {
void buy();
}
Fire_kirin类:
package simplefactory;
/**
*
* @author lzy
*/
public class Fire_kirin implements Product{
private final float price=88800;
//枪械的威力
private final float power=40;
//枪械的重量
private final float weight=40;
public float getPrice() {
return price;
}
public float getPower() {
return power;
}
public float getWeight() {
return weight;
}
@Override
public void buy() {
System.out.println("成功购买火麒麟,贪玩穿越,用薪创造快乐");
}
}
Thor类:
package simplefactory;
/**
*
* @author lzy
*/
public class Thor implements Product{
private final float price=88800;
//枪械的威力
private final float power=40;
//枪械的重量
private final float weight=40;
public float getPrice() {
return price;
}
public float getPower() {
return power;
}
public float getWeight() {
return weight;
}
@Override
public void buy() {
System.out.println("成功购买雷神,贪玩穿越,用薪创造快乐");
}
}
SimpleFactory类:
package simplefactory;
/**
*
* @author lzy
*/
public class SimpleFactory {
public static Product getProduct(String str){
if(str.equals("0001"))
return new Fire_kirin();
else if(str.equals("0002"))
return new Thor();
}
}
main函数:
package simplefactory;
public class main {
public static void main(String[] args)
{
Product A=SimpleFactory.getProduct("0001");
A.buy();
Product B=SimpleFactory.getProduct("0002");
B.buy();
System.out.println("恭喜你,又变强了");
}
}
执行结果:
简单工厂模式的一点思考
优点:
客户端不需要记忆类名,只要输入产品代号,就可以获得自己想要的商品,通过Product接口使代码结构更加清晰,向客户隐藏了产品细节,客户端只看到返回了Product类型,但不知道商品对应的具体类,具有一定的封装性
缺点:
简单工厂模式本身不易于扩展,每增加一类商品,就要实现一个产品类,同时要更改工厂方法,最终工厂方法可能变得十分臃肿(一坨if、else语句),不能很好体现开闭原则(即软件升级时应该通过扩展方式(添加新类、接口)实现,而不应该更改已有类的代码或是向已有类中插入代码),简单工厂模式应该适用于产品不多的情况,否则工厂类可能十分臃肿
参考资料:http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/simple_factory.html