情景描述
继上次的西红柿业务老板赚大发了之后,这次又给李四分发了一个新的任务,让他接手土豆分配,由于土豆大小不同,价格也不同,李四此时想,经过上次的任务之后,不可能每次任务都重新建设一个新的工厂,那成本未免也太高了吧,那肯定不行。
这时李四突然想到,为啥不直接建一个抽象工厂呢,到时候有任务就可以直接进行分配,无非就是分车间或生产线而已。
一、明确土豆大小
/**
* 抽象土豆
* @author Penglei
* @date 2020/12/26
* @version 1.0.0
* @updateVersion 1.0.0
*/
public interface Patato {
/*土豆信息*/
void tInfo();
}
/**
* 大土豆
* @author Penglei(红蜘蛛)
* @date 2020/12/26
* @version 1.0.0
* @updateVersion 1.0.0
*/
public class BigPotato implements Patato {
@Override
public void tInfo() {
System.out.println("我值5块一斤");
}
}
public class InPotato implements Patato {
@Override
public void tInfo() {
System.out.println("我值3块一斤");
}
}
二、确定抽象工厂
public interface IFactory<T> {
/*分类*/
Object sorting(Class<T> t) throws ClassNotFoundException
,IllegalAccessException
,InstantiationException;
}
/**
* 工厂实现
* @author Penglei(红蜘蛛)
* @date 2020/12/27
* @version 1.0.0
* @updateVersion 1.0.0
*/
public class PotatoFactory implements IFactory<Patato>{
@Override
public Object sorting(Class t) throws ClassNotFoundException
,IllegalAccessException
,InstantiationException {
return (Patato) Class.forName(t.getName()).newInstance();
}
}
开始生产
public class Client {
public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
IFactory factory = new PotatoFactory();
Patato p = (Patato) factory.sorting(BigPotato.class);
p.tInfo();
}
}
public class Client {
public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
IFactory factory = new PotatoFactory();
Patato p = (Patato) factory.sorting(InPotato.class);
p.tInfo();
}
}
开始新生产线
public class BigTomato implements Tomato {
@Override
public void tInfo() {
System.out.println("颜色比较红");
}
}
public class InTomato implements Tomato {
@Override
public void tInfo() {
System.out.println("颜色比较浅");
}
}
public class SmallTomato implements Tomato {
@Override
public void tInfo() {
System.out.println("还没成熟");
}
}
public class Client {
public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
/*土豆大小*/
IFactory factory = new PotatoFactory();
Patato p = (Patato) factory.sorting(InPotato.class);
p.tInfo();
System.out.println("---------------------------------------");
/*挑拣西红柿颜色*/
factory = new TomatoFactory1();
Tomato tomato = (Tomato) factory.sorting(BigTomato.class);
tomato.tInfo();
}
}
说明:
抽象工厂模式通常适的场景:
当需要创建的对象是一系列相互关联或相互依赖的产品族时,如蔬菜工厂中的土豆,西红柿,花椰菜等。
系统中有多个产品族,但每次只使用其中的某一族产品。如有人只喜欢穿某一个品牌的衣服和鞋。
系统中提供了产品的类库,且所有产品的接口相同,客户端不依赖产品实例的创建细节和内部结构。
如果产品族中只有一类产品,则不需要用到抽象工厂,只需要使用简单工厂或工厂方法模式
结尾
李四考虑充分完善,给老板节省了一大笔建设费用,老板送给了李四一辆奥迪。