工厂模式

文章探讨了在软件设计中,如何从简单工厂模式演进到工厂方法模式,以提高代码的灵活性和可扩展性。当蛋糕种类增多时,简单工厂模式需要不断修改,这违反了开闭原则。通过引入工厂接口和具体工厂类,每个蛋糕种类都有对应的工厂负责生产,实现了消费者只与具体工厂交互,降低了系统的耦合度。代码示例展示了这种演进过程,包括蛋糕接口、实现类和各自的工厂类。
摘要由CSDN通过智能技术生成

上一篇讲到简单工厂模式,比如某一天蛋糕店中增加了冰激凌口味的,如果还是使用简单工厂模式的话,代码如下:

public interface Cake {
 
    void display();
 
}
 
public class FruitCake implements Cake{
 
    public void display() {
        System.out.println("thie is a fruit cake");
    }
 
}
 
public class MousseCake implements Cake{
    public void display() {
        System.out.println("this is a MousseCake");
    }
}

public class iceCreamCake implements Cake{
    public void display() {
        System.out.println("this is a iceCreamCake");
    }
}
 
public class CakeFactory {
 
    private static Map<String,Cake> cakeMap = new HashMap();
 
    static {
        cakeMap.put("fruit",new FruitCake());
        cakeMap.put("mousse",new MousseCake());
        cakeMap.put("icecream",new iceCreamCake());
    }
 
    public static Cake buyCake(String type){
        return cakeMap.get(type.toLowerCase());
    }
 
}
 
public class Lisi {
 
    public static void main(String agrs[]){
        CakeFactory.buyCake("fruit").display();
        CakeFactory.buyCake("mousse").display();
        CakeFactory.buyCake("icecream").display();
    }
 
}

也就是每次新加口味的蛋糕,我们都需要针对蛋糕工厂进行修改,这就增加了系统的复杂性,同时违背的开闭原则,在蛋糕多到一定程度时,自然而然的就会考虑到,是否可以对工厂进行抽象,不同的产品使用不同的工厂生产,李四想要买慕斯蛋糕时,只需要去慕斯蛋糕的工厂即可,想要买水果蛋糕,则去水果蛋糕工厂。

系统角色演化为:

1)蛋糕(接口)

2)水果蛋糕(实现类)

3)慕斯蛋糕(实现类)

4)冰激凌蛋糕(实现类)

5)工厂(接口)

6)水果蛋糕工厂(实现类)

7)慕斯蛋糕(实现类)

8)冰激凌蛋糕(实现类)

9)李四(消费者)

代码如下:

public interface Cake {
 
    void display();
 
}
 
public class FruitCake implements Cake{
 
    public void display() {
        System.out.println("thie is a fruit cake");
    }
 
}
 
public class MousseCake implements Cake{
    public void display() {
        System.out.println("this is a MousseCake");
    }
}

public class iceCreamCake implements Cake{
    public void display() {
        System.out.println("this is a iceCreamCake");
    }
}
 
public interface CakeFactory {
 
    void buyCake();
 
}

/**
 * 专门制造销售水果蛋糕的工厂
 */
public class FruitCakeFactory implements CakeFactory{
    public void buy() {
        new FruitCake().display();
    }
}

/**
 * 专门制造慕斯蛋糕的工厂
 */
public class MousseCakeFactory implements CakeFactory{
    public void buy() {
        new MousseCake().display();
    }
}

/**
 * 制造冰激凌蛋糕的工厂
 */
public class IcecreamCakeFactory implements CakeFactory{
    public void buy() {
        new IcecreamCake().display();
    }
}

 
public class Lisi {
 
    public static void main(String agrs[]){
        CakeFactory fruitCakeFactory = new FruitCakeFactory();
        fruitCakeFactory.buy();
        CakeFactory mousseCakeFactory = new MousseCakeFactory();
        mousseCakeFactory.buy();
        CakeFactory icecreamCakeFactory = new IcecreamCakeFactory();
        icecreamCakeFactory.buy();
    }
 
}

运行结果:

this is a fruit cake
this is a MousseCake
this is a IcecreamCake

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值