设计模式:工厂模式

无工厂模式:

每个类都要求有具体的产品实现细节,并返回该产品。
例如:买电脑

class LenovoComputer{
    LenovoComputer(){}
    public void work(){
        System.out.println("Lenovo working...");
    }
}
class DellComputer{
    DellComputer(){}
    public void work(){
        System.out.println("Dell working...");
    }
}
//客户类
class Client{
    public static void main(String args[]){
        LenovoComputer lenovoComputer = new LenovoComputer();
        lenovoComputer.work();
        DellComputer dellComputer = new DellComputer();
        dellComputer.work();
    }
}

我们能发现客户端需要知道怎么去创建一个电脑,客户和电脑紧紧耦合在了一起,若是电脑端出现了一些问题,那么客户端就会崩溃。

简单工厂模式:

创建一个工厂来创建新的对象,把操作细节都放到工厂类中去,用户只需要给出产品的名称就可以得到产品,而不需要知道产品创建的细节。
简单工厂模式需要以下几个类:
1、产品抽象类(或是接口)
2、产品具体类
3、工厂类
4、 客户类

例如:买电脑

//产品抽象类Computer,每一个产品都要继承这个产品抽象类(或者实现产品抽象的接口),并重写类中的方法。
abstract class Computer{
    public abstract void work();
}

//若干个产品具体类Dell 和 Lenovo(有几个产品就有几个产品具体类),每一个具体类都继承了抽象类并重写了work()方法。
class Lenovo extends Computer{
    public void work(){
        System.out.println("Lenovo working...");
    }
}
class Dell extends Computer{
    public void work(){
        System.out.println("Dell working...");
    }
}

//工厂类,封装着产品实现的细节。
class Factory{
    public Computer getComputer(String computer){
        if(computer.equals("Lenovo")){
            return new Lenovo();
        }else if(computer.equals("Dell")){
            return new Dell();
        }else{
            return null;
        }
    }
}
//客户类,只需要建立一个工厂类,把需要得到的产品名传递给工厂类,便可以不用考虑产品实现的细节,直接拿到产品。
public class Client{
    public static void main(String args[]){
        Factory factory = new Factory();
        Computer computer = factory.getComputer("Lenovo");
        computer.work();
    }
}

Running:
Output: Lenovo working…
简单工厂模式客户端不需要知道电脑细节,仅仅声明一个电脑类型,输入电脑型号,便可以得到心仪的电脑,复用性也比无工厂模式要高,我若是想得到Dell电脑,只需要把字符串“Lenovo”改为“Dell”即可。

工厂方法模式:

通过简单工厂模式我们降低了客户端与产品的耦合性,但是在简单工厂模式中,工厂承受的压力太大,我们如果需要增加,修改或者删除一个产品,就必须到工厂类中进行修改,不能很好的实现java的“开闭原则”,而且若是产品的属性不相同,由一个工厂也不能很好的控制产品间属性的差异,因此引入了一种工厂方法模式,每个产品对应他自己的一个工厂类。
工厂方法模式需要以下几个类:
1、抽象工厂类
2、具体工厂类
3、抽象产品类
4、具体产品类
5、客户类

例如:买电脑

//抽象工厂类,有一个制造产品方法,以下的工厂具体类需要重写这个方法。
abstract class Factory{
    public abstract Computer creatComputer();
}
//若干个产品工厂类,一个产品对应一个产品工厂类,这样降低了工厂的压力,每个工厂只负责创建属于他的产品。
class LenovoFactory extends Factory{
    @Override
    public Computer creatComputer(){
        return new Lenovo();
    }
}
class DellFactory extends Factory{
    @Override
    public Computer creatComputer()
    {
        return new Dell();
    }
}
//抽象产品类
abstract class Computer{
    public abstract void work();
}
//若干个具体产品类
class Lenovo extends Computer{
    public void work(){
        System.out.println("Lenovo working...");
    }
}
class Dell extends Computer{
    public void work(){
        System.out.println("Dell working...");
    }
}
//客户类
public class Client{
    public static void main(String args[]){

       Factory factory = new LenovoFactory();
        Computer computer = factory.creatComputer();
        computer.work();
    }
}

Running:
Output: Lenovo working…
Dell working…

工厂方法模式为每一个产品类创建一个产品工厂,以便工厂可以更好的实现各个产品不同的属性,也是得产品类得到了更好的封装。

ps:待更…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值