在工厂模式中,抽象产品类Product负责定义产品的共性,实现对事务的抽像的定义, Creator为抽象创建类,也就是抽象工厂, 具体如何创建产品类是由具体的实现工厂ConcreateCreator完成的 下面以制作陶瓷的例子来讲解什么是工厂模式
//创建一个抽象陶瓷碗接口
public interface PorcelainBowl {
//在工厂模式中,抽象产品类Product负责定义产品的共性,实现对事务的抽像的定义,
//Creator为抽象创建类,也就是抽象工厂,
//具体如何创建产品类是由具体的实现工厂ConcreateCreator完成的
public void figure(); //每一个陶瓷碗都应该有自己的花纹
public void eat(); //每一个陶瓷碗都应该能吃饭
}
//第一种是镁质瓷
public class Magnesia implements PorcelainBowl {
@Override
public void figure() {
System.out.println("镁质瓷的花纹是鱼纹");
}
@Override
public void eat() {
System.out.println("镁质瓷能用来吃饭,是星级宾馆的最佳选择");
}
}
//第二种是强化瓷
public class Strengthen implements PorcelainBowl {
@Override
public void figure() {
System.out.println("强化瓷的花纹是莲花纹");
}
@Override
public void eat() {
System.out.println("强化瓷用来吃饭,一般用于消毒餐具市场");
}
}
//镁质强化瓷
public class MagnesiaStrengthen implements PorcelainBowl {
@Override
public void figure() {
System.out.println("镁质强化瓷用的花纹是牡丹纹");
}
@Override
public void eat() {
System.out.println("镁质强化瓷用来吃饭,一般用于现代化酒店,宾馆");
}
}
//在前面我们的陶瓷碗都已经定义好了(就相当于已经用各种泥巴捏出陶瓷碗的形状),
// 下一步就是定义一个烧瓷炉(这个炉已经定义好了所有的烧制步骤我们只需要放东西进去不需要我们管其他的),然后开始烧制陶瓷
//这里是定义一个抽象工厂(就是相当于一个抽象的炉)
public abstract class AbstractPorcelBowlFactory {
public abstract < T extends PorcelainBowl> T createPorcelainBowl(Class<T> c);
//在这里采用了定义泛形而限制必须是Class类型,必须是PorcelainBowl的实现类
//T表示只要实现PorcelainBowl接口都可以作为参数
}
public class PorcelainBowlFactory extends AbstractPorcelBowlFactory {
public <T extends PorcelainBowl> T createPorcelainBowl(Class<T> c) {
//定义一个要生产的陶瓷碗
PorcelainBowl porcelainBowl = null;
try {
porcelainBowl = (T) Class.forName(c.getName()).newInstance();
} catch (Exception e) {
System.out.println("烧制陶瓷失败");
}
return (T) porcelainBowl;
}
}
//这里就是陶瓷工人把泥巴放进烧制炉里面进行操作就行
public class Potter {
public static void main(String[] args) {
//定义出一个烧制炉
AbstractPorcelBowlFactory luzi=new PorcelainBowlFactory();
//烧制第一个镁质陶瓷碗
PorcelainBowl magnesia = luzi.createPorcelainBowl(Magnesia.class);
magnesia.figure();
magnesia.eat();
//烧制第2个强化陶瓷碗
PorcelainBowl strengthen = luzi.createPorcelainBowl(Strengthen.class);
strengthen.figure();
strengthen.eat();
//烧制第三个镁质强化陶瓷碗
PorcelainBowl magnesiaStrengthen=luzi.createPorcelainBowl(MagnesiaStrengthen.class);
magnesiaStrengthen.figure();
magnesiaStrengthen.eat();
}
}
//工厂模式的优点
//良好的的封装性,代码结构清晰,一个调用者需要一个具体产品的东西我们只需要知道这个产品的类名就可以了,不用知道怎么创建的,降低代码耦合性
//优秀的拓展性(比如简单工厂模式,多工厂模式,替代单例模式,延时初始化等)
//屏蔽产品类:这一个特点非常重要,产品类的实现如何变化,调用者不用担心,它只需要关心产品的接口,只要接口保持不变,系统的上层模块就不会发生变化
//在平常我们就能体会到工厂模式的好处,比如使用jdbc连接数据库,数据库从MySQL切换到oracle,需要改动的地方就是切换一下驱动名称(前提条件就是sql
//语句是标准语句,其他的都不需要修改这就是工厂模式灵活性的典型案例
//工厂模式的使用场景
//第一工厂模式是new一个对象的替代品,所以在所有需要生成对象的地方都可以使用,但是要考虑的是是否需要增加一个工厂进行管理,增加代码的复杂性
//需要灵活的,可拓展的框架,可以考虑工厂模式
参考书籍秦小波老师的《设计模式之禅第2版》