package com.example;
import com.example.abstractt.AbstractFoodFactory;
import com.example.abstractt.KFCFoodFactory;
import com.example.abstractt.LzlmFoodFactory;
import com.example.bean.INoodles;
import com.example.bean.LzNoodles;
import com.example.bean.PaoNoodles;
import com.example.mulway.MulWayNoodlesFactory;
import com.example.normal.GankouFactory;
import com.example.normal.NoodlesFactory;
import com.example.simple.SimpleNoodlesFactory;
import com.example.staticc.StaticNoodlesFactory;
public class MyClass {
public static void main(String[] args) {
System.out.println("==============================简单工厂==============================");
/**
* 简单工厂模式
*/
INoodles noodles = SimpleNoodlesFactory.createNoodles(SimpleNoodlesFactory.TYPE_GK);
noodles.desc();
/**
* 另一种简单工厂(反射)
* 利用Class.forName(clz.getName()).newInstance()
*/
System.out.println("=====另一种简单工厂(反射) 利用Class.forName(clz.getName()).newInstance()======" +
"\n个人觉得不好,因为这样和简单的new一个对象一样,工厂方法应该用于复杂对象的初始化" +
"\n 这样像为了工厂而工厂");
//兰州拉面
INoodles lz = StaticNoodlesFactory.createNoodles(LzNoodles.class);
lz.desc();
//泡面
INoodles pm = StaticNoodlesFactory.createNoodles(PaoNoodles.class);
pm.desc();
/**
* 多方法静态工厂(模仿Executor类)
*/
System.out.println("=====================多方法静态工厂(模仿Executor类)=============================" +
"\n 这种我比较青睐,增加一个新面条,只要去增加一个static方法即可,也不修改原方法逻辑");
INoodles lz2 = MulWayNoodlesFactory.createLz();
lz2.desc();
INoodles gk2 = MulWayNoodlesFactory.createGk();
gk2.desc();
/**
* 普通工厂方法:
*/
System.out.println("===========================普通工厂方法==============================" +
"\n 这种要多写一个类,不过更面向对象吧 = = ,实际中我更倾向于使用【模仿Executor类】的方式");
NoodlesFactory factory1 = new GankouFactory();
INoodles gk3 = factory1.create();
gk3.desc();
/**
* 抽象工厂方法:
*/
System.out.println("==============================抽象方法==============================" +
"\n 老实说,以我这一年的水平我体会不到抽象工厂有何巨大优势,所以在我这里我没有想到很好的使用场景。希望以后在慢慢体会吧。");
AbstractFoodFactory abstractFoodFactory1 = new KFCFoodFactory();
abstractFoodFactory1.createDrinks().prices();
abstractFoodFactory1.createNoodles().desc();
abstractFoodFactory1= new LzlmFoodFactory();
abstractFoodFactory1.createDrinks().prices();
abstractFoodFactory1.createNoodles().desc();
}
}