设计模式——工厂模式和策略模式的区别

工厂模式和策略模式在设计模式中都是重要的抽象概念。它们都涉及到了类的实例化,但区别在于实例化的时机和使用场景。工厂模式通过内部创建产品实例,然后提供给外部使用,而策略模式则允许外部直接实例化策略,再将其应用到特定环境中。这两种模式的应用有助于代码的灵活性和可扩展性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工厂模式和策略模式的区别

在使用上,两者都有一个抽象类或接口,供不同的“产品”或者“策略”去继承或者实现,不同点在于,工厂模式中,具体产品的实例化发生在工厂内部,然后通过工厂的某个方法传递给外部使用,而策略模式是在外部实例化一个策略,然后传递到使用环境中,再由环境对其应用。这样说比较抽象,可以参考具体例子。

//工厂模式
//抽象产品
/**
 * Created by zhangx-ae on 2016/4/13.
 */
public interface IProduct {
    void action();
}
//产品A
public class ProductA implements IProduct {
    @Override
    public void action() {
        System.out.println("我是产品A");
    }
}
//产品B
public class ProductB implements IProduct {
    @Override
    public void action() {
        System.out.println("我是产品B");
    }
}
//产品C
public class ProductC implements IProduct {
    @Override
    public void action() {
        System.out.println("我是产品C");
    }
}
//简单工厂
/**
 * Created by zhangx-ae on 2016/4/13.
 * 简单工厂中只能通过接受创建产品的参数确定创建相应的对象,
 * 当有新的产品的时候还需要修改工厂代码,很明显不符合开闭原则,
 * 这里只是比较工厂模式和策略模式的区别,因此只采用简单工厂模式进行说明
 */
public class Factory {
    public IProduct getProduct(String productType){
        if(productType.equals("A")){
            return new ProductA();
        }else if(productType.equals("B")){
            return new ProductB();
        }else if(productType.equals("C")){
            return new ProductC();
        }
        return null;
    }
}
//客户端
/**
 * Created by zhangx-ae on 2016/4/13.
 */
public class ClientDemo {
    public static void main(String[] args) {
        Factory factory = new Factory();
        IProduct product = factory.getProduct("A");
        product.action();
    }
}

//策略模式
/**
 * Created by zhangx-ae on 2016/4/13.
 * 计算存款利息
 */
public interface IStrategy {
    double calcInterests(double investment);
}
/**
 * Created by zhangx-ae on 2016/4/13.
 * 定期存款一年
 */
public class StrategyA implements IStrategy {
    @Override
    public double calcInterests(double investment) {
        System.out.println("计算定期利息");
        return investment * 0.015;
    }
}
/**
 * Created by zhangx-ae on 2016/4/13.
 * 活期利息
 * 为了突出重点,这里简化了计算方法
 */
public class StrategyB implements IStrategy {
    @Override
    public double calcInterests(double investment) {
        System.out.println("计算活期利息");
        return investment * 0.008;
    }
}
//应用环境
public class GetInterests {
    private IStrategy strategy;
    /**
     * 传入一个具体的计算利息的策略对象
     * @param strategy 具体的策略对象
     */
    public GetInterests(IStrategy strategy){
        this.strategy = strategy;
    }
    /**
     * 根据具体策略计算利息
     * @param investment  本金
     * @return             利息
     */
    public double getInterests(double investment){
        return this.strategy.calcInterests(investment);
    }
}
//客户端
/**
 * Created by zhangx-ae on 2016/4/13.
 */
public class ClientDemo {
    public static void main(String[] args) {
        IStrategy strategy = new StrategyA();
        GetInterests getInterests = new GetInterests(strategy);
        double interests = getInterests.getInterests(1000);
        System.out.printf("利息是:" + interests);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值