设计模式——工厂方法模式、抽象工厂模式

模式引入:

工厂:任何可以产生对象的方法或者类。

简单工厂

注:这不属于23中设计模式之一

场景引入

首先,我们想象这样一个场景:创业初期,一个人开了一个工厂生产手机和智能手表。(现实生活中,当然是先生产一个,但是为了好写一些,就假装有两种产品,其实一种产品的也算)

代码实现

device interface

/*
接口,用来说明设备的生产过程
*/

public interface device {
    void process();
}

phone.class

// 手机类,用来说明手机是怎么生产的
public class phone implements device{
    public void process() {
        System.out.println("手机的生产过程就是先这样这样,再那样那样,就生产出来了");
    }
}

Watch.class

// 智能手环,用来说明智能手环是怎么生产的
public class Watch implements device {
    public void process() {
        System.out.println("智能手环的生产方式就是先那样那样,再这样这样,就生产出来了");
    }
}

SimpleFactory.class

//这就是开的那个工厂,可以生产手机和智能手环
public class SimpleFactory {
    public device create(String s){
        if(s.equals("phone")){
            return new phone();
        }else if(s.equals("watch")){
            return new Watch();
        } else { **//注意这里**
            throw new RuntimeException("你说的产品我们还没有,如果你们需要,我们今后会生产的");
        }
    }
}

test.class

public class Test {
    public static void main(String[] args) {
        SimpleFactory factory = new SimpleFactory();
        device phone = factory.create("phone");
        phone.process();
        device watch = factory.create("watch");
        watch.process();
        /*
        **注意这里**
        device ipad = factory.create("ipad");
        ipad.process();
         */

    }
}

代码简要说明

在简单工厂中,我们只需要说明,我们需要的是什么,工厂就能调用相应的方法给我们生产出我们需要的设备。

拓展

注意在SimpleFactory类中的最后一个else语句,以及test类中最后一个注释掉的语句。如下:
SimpleFactory:
在这里插入图片描述
Test:
在这里插入图片描述想象一个具体的情况:创业者觉得自己现在生产的东西不够多,想要更多的产品。(当然,一般情况下是:人们觉得这个工厂生产的东西好,想要看看这个工产是都生产其他产品。比如这里代码中的ipad)。这种情况下,我们就需要在原来的代码中增加一个Ipad类

public class Ipad implements device{
    public void process() {
        System.out.println("Ipad就是这样弄一下,那样弄一下,就生产出来了");
    }
}

然后为了这个工产能够生产Ipad,SimpleFactory类就需要改成下面这样:

public class SimpleFactory {
    public device create(String s){
        if(s.equals("phone")){
            return new phone();
        }else if(s.equals("watch")){
            return new Watch();
        }else if(s.equals("ipad")){
            return new Ipad();
        } else {
            throw new RuntimeException("你说的产品我们还没有,如果你们需要,我们今后会生产的");
        }
    }
}

增加一个ipad类其实并不影响,主要问题出现在修改了SimpleFactory类中的代码。这就好比为了生产新的产品Ipad,发现原来的场地不够用,就把原来的工产拆了,然后建了一个更大的工厂(有钱任性,我们管不了,但是至少正常人不会这么干)。这样就显示出了简单工场模式的缺点:扩展性差。就是说不能生产新的产品。

工厂方法模式

场景引入

但是,如果创业者想要把企业做大,他肯定会在工厂中生产新产品。(有钱人总想变得更有钱,只有我被贫穷蒙蔽的双眼)。那么如果我们要生产新的产品,上面说的简单共产模式就不管用了,就引入了我们的工厂方法模式。这就好像是:为每一个设备创建一个工厂

代码实现

device interface

/*
接口,用来说明设备的生产过程
*/

public interface device {
    void process();
}

phone.class

// 手机类,用来说明手机是怎么生产的
public class phone implements device{
    public void process() {
        System.out.println("手机的生产过程就是先这样这样,再那样那样,就生产出来了");
    }
}

Watch.class

// 智能手环,用来说明智能手环是怎么生产的
public class Watch implements device {
    public void process() {
        System.out.println("智能手环的生产方式就是先那样那样,再这样这样,就生产出来了");
    }
}

Ipad.class

// Ipad,用来说明Ipad是怎么生产的
public class Ipad implements device{

    public void process() {
        System.out.println("Ipad就是这样弄一下,那样弄一下,就生产出来了");
    }
}

Factory.class

//把厂抽象出来,自己不做具体的生产实现
public  abstract class Factory {
     abstract device create();
}

phoneFactory.class

//生产手机的工厂,具体实现生产手机
public class phoneFactory extends Factory {

    device create() {
        return new phone();
    }
}

WatchFactory.class

//生产智能手表的工厂,具体实现生产智能手表
public class WatchFactory extends Factory{
    device create() {
        return new Watch();
    }
}

IpadFactory.class

//生产Ipad的工厂,具体实现生产Ipad
public class IpadFactory extends Factory{

    device create() {
        return new Ipad();
    }
}

Test.class

public class Test {
    public static void main(String[] args) {
        Factory factory = new WatchFactory();
        device watch = factory.create();
        watch.process();
        factory = new IpadFactory();
        device ipad = factory.create();
        ipad.process();
        factory = new phoneFactory();
        device phone = factory.create();
        phone.process();

    }
}

代码简要说明

在共产方法模式下,工厂不在做具体的生产实现,而是交给各个具体的分工厂去实现。但是,这种情况下,这时候,你要的产品就通过产品的具体类名体现出来:
在这里插入图片描述
这时候,当增加新的产品时,我们就不需要再改变工厂类了。比如,我们要增加一个新的产品:电脑。只需要增加新的类和具体的工厂。如下:
Computer:

public class Computer implements device{
    public void process() {
        System.out.println("电脑就是瞎捯饬捯饬就生产出来了");
    }
}

ComputerFactory

public class ComputerFactory extends Factory{
    device create() {
        return new Computer();
    }
}

然后我们再测试类中就可以直接使用了:
Test:

public class Test {
    public static void main(String[] args) {
        Factory factory = new WatchFactory();
        device watch = factory.create();
        watch.process();
        factory = new IpadFactory();
        device ipad = factory.create();
        ipad.process();
        factory = new phoneFactory();
        device phone = factory.create();
        phone.process();
        
        factory = new ComputerFactory();
        device computer = factory.create();
        computer.process();

    }
}

这就好像是开分工厂一样,这样就不需要将原来的工厂拆除,再建新的工厂。

抽象工厂模式

情景引入

刚刚那个创业者成功了,这时候就开始有人眼红了。于是,也想开始和他一样,做同样的工厂。因为有了前人的经验,新来的创业者发现这个工厂生产的东西已经固定下来了,而且用多个分厂,用显得非常的麻烦。于是,新来的创业者开的厂就把这些整合起来,用一个厂进行生产。抽象工厂模式的概念就是:一个抽象类中包含多个抽象产品类

代码实现

device interface

/*
接口,用来说明设备的生产过程
*/

public interface device {
    void process();
}

phone.class

// 手机类,用来说明手机是怎么生产的
public class phone implements device{
    public void process() {
        System.out.println("手机的生产过程就是先这样这样,再那样那样,就生产出来了");
    }
}

Watch.class

// 智能手环,用来说明智能手环是怎么生产的
public class Watch implements device {
    public void process() {
        System.out.println("智能手环的生产方式就是先那样那样,再这样这样,就生产出来了");
    }
}

Ipad.class

// Ipad,用来说明Ipad是怎么生产的
public class Ipad implements device{

    public void process() {
        System.out.println("Ipad就是这样弄一下,那样弄一下,就生产出来了");
    }
}

Computer.class

public class Computer implements device{
    public void process() {
        System.out.println("电脑就是瞎捯饬捯饬就生产出来了");
    }
}

Factory.class

public  abstract class Factory {
     abstract device phoneCreate();
     abstract device ipadCreate();
     abstract device watchCreate();
     abstract device computerCreate();
}

NewFactory.class

public class NewFactory extends Factory {
    device phoneCreate() {
        System.out.println("我是新创业者");
        return new phone();
    }

    device ipadCreate() {
        System.out.println("我是新创业者");
        return new Ipad();
    }

    device watchCreate() {
        System.out.println("我是新创业者");
        return new Watch();
    }

    device computerCreate() {
        System.out.println("我是新创业者");
        return new Computer();
    }
}

OldFactory.class

public class OldFactory extends Factory{
    device phoneCreate() {
        System.out.println("我是老创业者");
        return new phone();
    }

    device ipadCreate() {
        System.out.println("我是老创业者");
        return new Ipad();
    }

    device watchCreate() {
        System.out.println("我是老创业者");
        return new Watch();
    }

    device computerCreate() {
        System.out.println("我是老创业者");
        return new Computer();
    }
}

Test.class

public class Test {
    public static void main(String[] args) {
        Factory factory = new NewFactory();
        device Newfactory = factory.computerCreate();
        Newfactory.process();
        Newfactory = factory.ipadCreate();
        Newfactory.process();
        Newfactory = factory.phoneCreate();
        Newfactory.process();
        Newfactory = factory.watchCreate();
        Newfactory.process();
        System.out.println("==============");
        factory = new OldFactory();
        device old = factory.computerCreate();
        old.process();
        old = factory.ipadCreate();
        old.process();
        old = factory.phoneCreate();
        old.process();
        old = factory.watchCreate();
        old.process();
    }
}

代码解读

抽象工厂模式就像是工厂方法模式的整合,因为那里面的具体工厂太多了,就显得很复杂,将一些产品放在一起进行抽象工厂,就会减少其复杂性。

写在最后

故事完整串联简单工厂模式,工厂方法模式、抽象工厂模式:简单工厂模式就像是早期的工厂,当要增加生产新的产品。因为地方不够,就用分工厂来进行解决,其实这里我们把简单共产模式想成早期的生产一样产品的更好理解。然后当新工厂不断增加时,工厂太多就不好进行管理,然后将一些工厂进行整合,形成抽象工厂模式。这就好像时现实生活中的工厂有很多的生产线,每条工厂线生产不同的产品。生活中就是将每个共产的量缩小,使得每个工厂都能生产公司的所有产品。或者是一个人用别人已有的模式来进行生产。具体的情况有很多很多。说多了,更容易让人不好理解,我就不多说啦。QAQ,该睡觉了,不然要猝死了。不懂的可以留言~~~~~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值