设计模式之工厂系列

修真者想要修炼只需要吃灵药和仙露就可以升级,那么他并不需要知道这种能令自己升级的东西是怎么创造出来的,只需要去对应的商店购买就好了。这个时候就需要一个商店,工厂类就是这样的一个存在。购买者根据不同的需求获得不同的物品。

1.简单工厂模式

创建一个工厂类,对同一方法的一些类进行实例化的创建返回,这种简单工厂的可扩展性不好。
package com.zcm.factory.simple;

import com.zcm.factory.*;

/**
 * @program: demo
 * @ClassName:SimpleVehicleFactory
 * @Description:简单工厂:创建一个工厂类,对同一方法的一些类进行实例化的创建返回,这种简单工厂的可扩展性不好。
 * @Author:zcm
 * @Date:2021/2/1 16:37
 */
public class SimpleFactory {

    public Food createFood(int type) {
        Food food = null;
        switch (type) {
            default:
                food = new Elixir();
                break;
            //灵药
            case 1:
                food = new Elixir();
                break;
            //仙露
            case 2:
                food = new Xianlu();
                break;
        }
        return food;
    }

    public static void main(String[] args) {
        System.out.println("修真者用什么修炼:");
        new SimpleFactory().createFood(1).eat();
        new SimpleFactory().createFood(2).eat();
    }
}

2.工厂方法

提供多个⼯厂⽅法,分别创建相应的对象或者接口实现返回。

package com.zcm.factory.factorymethod;

import com.zcm.factory.*;

/**
 * @program: demo
 * @ClassName:XianluFactory
 * @Description:工厂方法:提供多个⼯厂⽅法,分别创建相应的对象或者接口实现返回
 * @Author:zcm
 * @Date:2021/2/1 16:57
 */
public class FoodFactory {
    /**
     * @Description:灵药
     * @Author: zcm
     * @Version:v.2.7.1
     * @Date:2021/2/1 17:16
     */
    public Food createElixir() {
        System.out.println("灵药是怎么生长的?");
        System.out.println("需要日月精华日积月累灌溉十万年最终长成灵药~");
        return new Elixir();
    }

    /**
     * @Description:仙露,随意制作仙露过程
     * @Author: zcm
     * @Version:v.2.7.1
     * @Date:2021/2/1 17:16
     */
    public Food createXianlu() {
        System.out.println("仙露是怎么制成的?");
        System.out.println("1.需要仙山雨露经过层层提炼最后制成仙露~");
        return new Xianlu();
    }

    public static void main(String[] args) {
        System.out.println("修真世界的人可以吃的食物有:");
        new FoodFactory().createElixir().eat();
        new FoodFactory().createXianlu().eat();
    }
}

3.静态工厂方法

将多个工厂⽅法置为静态的,不需要创建⼯厂实例,直接调⽤即可;
package com.zcm.factory.factorymethod;

import com.zcm.factory.*;

/**
 * @program: demo
 * @ClassName:FoodStaticFactory
 * @Description:静态⼯厂⽅法模式:将多个工厂⽅法置为静态的,不需要创建⼯厂实例,直接调⽤即可;
 * @Author:zcm
 * @Date:2021/2/1 17:37
 */
public class FoodStaticFactory {

    /**
     * @Description:灵药
     * @Author: zcm
     * @Version:v.2.7.1
     * @Date:2021/2/1 17:16
     */
    public static Food createElixir() {
        System.out.println("灵药是怎么生长的?");
        System.out.println("需要日月精华日积月累灌溉十万年最终长成灵药~");
        return new Elixir();
    }

    /**
     * @Description:仙露
     * @Author: zcm
     * @Version:v.2.7.1
     * @Date:2021/2/1 17:16
     */
    public static Food createXianlu() {
        System.out.println("仙露是怎么制成的?");
        System.out.println("1.需要仙山雨露经过层层提炼最后制成仙露~");
        return new Xianlu();
    }

    public static void main(String[] args) {
        System.out.println("修真世界的人可以吃的食物有:");
        FoodStaticFactory.createElixir().eat();
        FoodStaticFactory.createXianlu().eat();

    }

}

4.关系图

 5.适⽤用场景:

凡是出现了⼤量不同种类的产品需要创建,并且具有共同的接口时,可以通过⼯厂⽅法模式进⾏创建。在以上的三种模式 中,第⼀种如果传⼊的类型不对,不能创建自己想要的对象,第三种相对于第二种,不需要实例化⼯厂类,多数情况下,我们会选⽤用第三种静态⼯⼚⽅法模式。

6.抽象工厂

工厂模式只能让修真者修炼上提升,那么万一在我修炼的时候,被我的敌人偷袭了怎么办?我能不能搞点东西加个防御啥的?在搞个武器放在身边防身?

1.食物

package com.zcm.factory;

/**
 * @program: DemoZCM
 * @ClassName Food
 * @Description:任意定制食物继承Food
 * @Author zcm
 * @Date 2021/1/26 17:35
 * @Version V1.0
 */
public abstract class Food {
    public abstract void eat();
}

1.1 灵药

 

package com.zcm.factory;

/**
 * @program: DemoZCM
 * @ClassName Elixir
 * @Description
 * @Author zcm
 * @Date 2021/1/26 17:55
 * @Version V1.0
 */
public class Elixir extends Food {
    @Override
    public void eat() {
        System.out.println("吃灵药....");
    }
}

1.2 仙露

package com.zcm.factory;

/**
 * @program: demo
 * @ClassName:Xianlu
 * @Description:
 * @Author:zcm
 * @Date:2021/2/1 16:49
 */
public class Xianlu extends Food {
    @Override
    public void eat() {
        System.out.println("喝仙露...");
    }
}

1.3面包

package com.zcm.factory;

/**
 * @program: DemoZCM
 * @ClassName Bread
 * @Description
 * @Author zcm
 * @Date 2021/1/26 17:43
 * @Version V1.0
 */
public class Bread extends Food {
    @Override
    public void eat() {
        System.out.println("吃面包.....");
    }
}

2.服装

package com.zcm.factory;

/**
 * @program: DemoZCM
 * @ClassName Clothes
 * @Description:任意定制服装继承Clothes
 * @Author zcm
 * @Date 2021/1/26 17:35
 * @Version V1.0
 */
public abstract class Clothes {
    /**
     * @Description:服装
     * @Author: zcm
     * @Version:v.2.3.0
     * @Date:2021/1/26 17:37
     */
    public abstract void clothes();

}

2.1道袍

package com.zcm.factory;

/**
 * @program: DemoZCM
 * @ClassName TaoRobe
 * @Description
 * @Author zcm
 * @Date 2021/1/26 17:52
 * @Version V1.0
 */
public class TaoRobe extends Clothes {
    @Override
    public void clothes() {
        System.out.println("穿天尊道袍.....");
    }
}

2.2 连衣裙

package com.zcm.factory;

/**
 * @program: DemoZCM
 * @ClassName Dress
 * @Description
 * @Author zcm
 * @Date 2021/1/26 18:00
 * @Version V1.0
 */
public class Dress extends Clothes {
    @Override
    public void clothes() {
        System.out.println("穿连衣裙....");
    }
}

3.武器

package com.zcm.factory;

/**
 * @program: demo
 * @ClassName:Arms
 * @Description:
 * @Author:zcm
 * @Date:2021/2/2 10:00
 */
public abstract class Arms {
    public abstract void  arms();
}

3.1 枪【M416】

 

package com.zcm.factory;

/**
 * @program: demo
 * @ClassName:Gun
 * @Description:
 * @Author:zcm
 * @Date:2021/2/2 10:03
 */
public class Gun extends Arms {
    @Override
    public void arms() {
        System.out.println("拿M416");
    }
}

 3.2剑【诛仙剑】

package com.zcm.factory;

/**
 * @program: demo
 * @ClassName:Sword
 * @Description:
 * @Author:zcm
 * @Date:2021/2/2 10:02
 */
public class Sword extends Arms {
    @Override
    public void arms() {
        System.out.println("持诛仙剑");
    }
}

4.抽象工厂:制作食物,制作服装,制作武器。

package com.zcm.factory.abstractfactory;

import com.zcm.factory.*;

/**
 * @program: DemoZCM
 * @ClassName AbstractFactory
 * @Description
 * @Author zcm
 * @Date 2021/1/26 17:12
 * @Version V1.0
 */
public abstract class AbstractFactory {
    /**
     * @Description:食物
     * @Author: zcm
     * @Version:v.2.3.0
     * @Date:2021/1/26 17:13
     */
    public abstract Food createFood();

    /**
     * @Description:服装
     * @Author: zcm
     * @Version:v.2.3.0
     * @Date:2021/1/26 17:27
     */
    public abstract Clothes createClothes();


    /**
     * @Description:武器
     * @Author: zcm
     * @Version:v.2.3.0
     * @Date:2021/1/26 17:27
     */
    public abstract Arms createArms();

}

4.1 具体工厂【修真世界的工厂】

 

package com.zcm.factory.abstractfactory;

import com.zcm.factory.*;
import com.zcm.factory.abstractfactory.*;

/**
 * @program: DemoZCM
 * @ClassName FoodFactory
 * @Description:修真世界的人
 * @Author zcm
 * @Date 2021/1/26 17:33
 * @Version V1.0
 */
public class ComprehensionFactory extends AbstractFactory {
    @Override
    public Food createFood() {
        System.out.println("灵药生长过程:");
        System.out.println("需要日月精华日积月累灌溉十万年最终长成灵药~");
        return new Elixir();
    }

    @Override
    public Clothes createClothes() {
        System.out.println("道袍制作过程:");
        System.out.println("天蚕丝和防御宝石缝制七天最终制成天尊道袍");
        return new TaoRobe();
    }

    @Override
    public Arms createArms() {
        System.out.println("诛仙剑制作过程:");
        System.out.println("玄光铁10斤,环心沙10斤,极影铜10斤,心头血一碗....在炼器炉中经过九九八十一日破炉而出,在经过天劫锤炼而成~");
        return new Sword();
    }
}

4.2 具体工厂【现代世界的工厂】

 

package com.zcm.factory.abstractfactory;

import com.zcm.factory.*;
import com.zcm.factory.abstractfactory.*;

/**
 * @program: DemoZCM
 * @ClassName modernFactory
 * @Description
 * @Author zcm
 * @Date 2021/1/26 17:59
 * @Version V1.0
 */
public class ModernFactory extends AbstractFactory {
    @Override
    public Food createFood() {
        System.out.println("面包制作过程:");
        System.out.println("烤箱烤出来的~");
        return new Bread();
    }

    @Override
    public Clothes createClothes() {
        System.out.println("连衣裙制作过程:");
        System.out.println("天蚕丝手缝数来的~");
        return new Dress();
    }

    @Override
    public Arms createArms() {
        System.out.println("M416制作过程:");
        System.out.println("工程师制成的~");
        return new Gun();
    }
}

5.开始使用

package com.zcm.factory.abstractfactory;

import com.zcm.factory.*;
import com.zcm.factory.abstractfactory.*;

/**
 * @program: DemoZCM
 * @ClassName Main
 * @Description
 * @Author zcm
 * @Date 2021/1/26 18:01
 * @Version V1.0
 */
public class TestMain {
    public static void main(String[] args) {
        //修真世界的人
        System.out.println("修真世界的人----------------");
        AbstractFactory factory = new ComprehensionFactory();
        factory.createClothes().clothes();
        factory.createFood().eat();
        factory.createArms().arms();
        System.out.println("------------------------------");
        //现代世界的人
        System.out.println("现代世界的人------------------");
        factory = new ModernFactory();
        factory.createClothes().clothes();
        factory.createFood().eat();
        factory.createArms().arms();
        System.out.println("------------------------------");
    }
}

6.关系图 

7.效果如下: 

总结:

工厂模式: 

优点:

1、一个调用者想创建一个对象,只要知道其名称就可以了。

2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。

3、屏蔽产品的具体实现,调用者只关心产品的接口。

缺点:

1.每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。耦合性太高。

抽象工厂:

优点:

1.当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

缺点:

但是抽象工厂想要扩展其中某一个产品,既要在food,clothes,arm加代码,又要再具体实现里加代码,很麻烦。

但是springIOC和Bean工厂可以很好的规避这个问题。

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值