设计模式——工厂模式

什么是工厂模式

前面我们介绍了简单工厂模式,知道了简单工厂模式不容易扩展,在产品类型比较多的情况下,工厂模式在一定程度上解决了不易扩展的问题,每种商品都有一个特定的工厂负责生产,并且这个工厂只负责生产一种商品

 

工厂模式的角色

Product:产品接口,定义产品的共有行为

ConcreteProduct:具体产品,定义产品的具体属性和行为

Factory:抽象工厂,定义工厂的共有行为

ConcreteFactory:具体工厂,定义工厂的具体行为

 

../_images/FactoryMethod.jpg

 

接下来我们将上次的例子改为工厂模式,即工厂负责生产火麒麟、雷神两把武器

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();
     }
}

 

运行结果:

 

工厂模式的一点思考

优点:

工厂模式不同于简单工厂模式,很好的满足了开闭原则,当我们想要新增一个产品时,不用修改现有的类代码,只需要新增一个产品类和对应的工厂类即可

 

缺点:

每个工厂只能生产一种产品,不能同时生产多种,当产品数量增多时,工厂文件可能就会非常非常的多,当产品数量不多时,简单工厂又能较好的满足,所以工厂模式处于稍微有点尴尬的状态

 

另外一点是为什么工厂和产品都要定义一组接口呢?似乎没有接口,也能很好的满足开闭原则

这里先来说说自己对接口的一点理解:

使用接口可以提高代码的封装性,隐藏一些代码实现的细节,阅读一些源码时就会发现,接口真的能隐藏代码实现的细节,除了提供封装性外,使用接口可以使代码结构更加规范,不使用接口,代码结构可能就是这样的:

当类的数目多起来时,代码结构就会非常的乱,如果使用接口:

当类数目多起来时,合理的使用接口,可以让代码结构更加清晰,相当于对所有的类进行了分类,同时阅读接口,大致上就可以知道这些类的公有特性,所以在设计模式中,当类的数目多起来时,我们总可以看到接口的身影,包括工厂模式

除了上述几点,接口还有一个目的是为了实现多继承

 

如有错误,欢迎指出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值