什么是工厂模式
前面我们介绍了简单工厂模式,知道了简单工厂模式不容易扩展,在产品类型比较多的情况下,工厂模式在一定程度上解决了不易扩展的问题,每种商品都有一个特定的工厂负责生产,并且这个工厂只负责生产一种商品
工厂模式的角色
Product:产品接口,定义产品的共有行为
ConcreteProduct:具体产品,定义产品的具体属性和行为
Factory:抽象工厂,定义工厂的共有行为
ConcreteFactory:具体工厂,定义工厂的具体行为
接下来我们将上次的例子改为工厂模式,即工厂负责生产火麒麟、雷神两把武器
Product接口:
package Factory;
/**
*
* @author lzy
*/
public interface Product {
void Buy();
}
Thor类:
package Factory;
/**
*
* @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("成功购买雷神,贪玩穿越,用薪创造快乐");
}
}
Fire_kirin类:
package Factory;
/**
*
* @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("成功购买火麒麟,贪玩穿越,用薪创造快乐");
}
}
Factory接口:
package Factory;
/**
*
* @author lzy
*/
public interface Factory {
Product getProduct();
}
Fire_kirin_Factory类:
package Factory;
/**
*
* @author lzy
*/
public class Fire_kirin_Factory implements Factory{
@Override
public Product getProduct() {
return new Fire_kirin();
}
}
Thor_Factory类:
package Factory;
/**
*
* @author lzy
*/
public class Thor_Factory implements Factory{
@Override
public Product getProduct() {
return new Thor();
}
}
main:
package Factory;
/**
*
* @author lzy
*
*/
public class main {
public static void main(String[] args){
Factory FirekFactory=new Fire_kirin_Factory();
Product A=FirekFactory.getProduct();
A.Buy();
Factory ThFactory=new Thor_Factory();
Product B=ThFactory.getProduct();
B.Buy();
}
}
运行结果:
工厂模式的一点思考
优点:
工厂模式不同于简单工厂模式,很好的满足了开闭原则,当我们想要新增一个产品时,不用修改现有的类代码,只需要新增一个产品类和对应的工厂类即可
缺点:
每个工厂只能生产一种产品,不能同时生产多种,当产品数量增多时,工厂文件可能就会非常非常的多,当产品数量不多时,简单工厂又能较好的满足,所以工厂模式处于稍微有点尴尬的状态
另外一点是为什么工厂和产品都要定义一组接口呢?似乎没有接口,也能很好的满足开闭原则
这里先来说说自己对接口的一点理解:
使用接口可以提高代码的封装性,隐藏一些代码实现的细节,阅读一些源码时就会发现,接口真的能隐藏代码实现的细节,除了提供封装性外,使用接口可以使代码结构更加规范,不使用接口,代码结构可能就是这样的:
当类的数目多起来时,代码结构就会非常的乱,如果使用接口:
当类数目多起来时,合理的使用接口,可以让代码结构更加清晰,相当于对所有的类进行了分类,同时阅读接口,大致上就可以知道这些类的公有特性,所以在设计模式中,当类的数目多起来时,我们总可以看到接口的身影,包括工厂模式
除了上述几点,接口还有一个目的是为了实现多继承
如有错误,欢迎指出