02 设计模式 工厂模式

工厂模式

静态工厂

使用工厂前如下图:

在使用静态工厂之前我们创造对象都需要自己使用new关键字进行创建,而使用工厂之后便不需要自己进行创建,直接在工厂中取出成品便可以直接使用,不需要关心创造细节;

例如:我想买一台电脑,在没有工厂的时候我只能自己做,需要什么样的CPU、什么样的内存等等,这些都需要我们自己去配置;而在有了工厂之后便不需要这么麻烦了,我想买电脑,直接去工厂里买就可以,不需要关心是怎么样配置的,只要拿过来就可以直接使用了。

对于消费者来说,可以看到的只有电脑工厂,具体的生产细节对消费者透明

  • 代码如下

    电脑类:

    /*电脑的接口类*/
    public interface Computer {
        public String getComputer();
    }
    
    /*戴尔的电脑*/
    public class DellComputer implements Computer{
        @Override
        public String getComputer() {
            return "Dell";
        }
    }
    
    /*联想的电脑*/
    public class LenovoComputer implements Computer{
        @Override
        public String getComputer() {
            return "Lenovo";
        }
    }

    电脑工厂类

    public class ComputerFactory {
        public static Computer getComputer(String brand){
            if (brand.equals("戴尔")){
                return new DellComputer();
            }else if(brand.equals("联想")){
                return new LenovoComputer();
            }
            return null;
        }
    }

    在我想要什么样的电脑直接告诉工厂就可以了,它会给我返回我需要的电脑

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String comp;
        do {
            System.out.print("输入你要买的电脑(退出输入”exit“):");
            comp = in.next();
            if (comp.equals("exit")) {
                break;
            }
            System.out.println(ComputerFactory.getComputer(comp).getComputer());
        } while (true);
    }

这个工厂看似很好,但是却有一个问题。那就是在添加品牌的时候,必须改动工厂方法,这样就破坏了开闭原则,这时就需要一种方法来解决这件事情

方法工厂

方法工厂就是在静态工厂的基础上,建立了一个方法工厂;使得每一个类都有一个工厂,在添加类时不会破坏开闭原则

添加新的类时不会影响原有类

代码如下

电脑类:

/*电脑的接口类*/
public interface Computer {
    public String getComputer();
}

电脑类及其工厂

/*戴尔的电脑*/
public class DellComputer implements Computer{
    @Override
    public String getComputer() {
        return "Dell";
    }
}
/*戴尔的工厂*/
public class DellComputerFactory implements ComputerFactory{
    @Override
    public Computer getComputer() {
        return new DellComputer();
    }
}


/*联想的电脑*/
public class LenovoComputer implements Computer{
    @Override
    public String getComputer() {
        return "Lenovo";
    }
}
/*联想的工厂*/
public class LenovoComputerFactory implements ComputerFactory {
    @Override
    public Computer getComputer() {
        return new LenovoComputer();
    }
}

测试类

public static void main(String[] args) {
    Computer computer1 = new DellComputerFactory().getComputer();
    Computer computer2 = new LenovoComputerFactory().getComputer();

    System.out.println(computer1.getName());
    System.out.println(computer2.getName());
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值