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