工厂模式是什么
工厂设计模式事常见的设计模式,属于创建型模式。在工厂中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。一般在创建复杂对象的地方可以选择使用工厂模式,简单对象的话可以使用new去创建。工厂除了将创建和使用对象分离,还有一个作用就是可以屏蔽一些创建对象后初始化的事情,如果直接反射具体的产品对象,那么反射对象后,需要每次都做初始化的工作,而放在工厂中,就不需要每次都初始化了
工厂模式优缺点
优点: 1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
工厂模式示例代码
关系图式
抽象产品:它是定义产品的接口,是工厂方法模式所创建对象的超类型,也就是产品对象的公共父类。
具体产品:它实现了抽象产品接口,某种类型的具体产品由专门的具体工厂创建,具体工厂和具体产品之间一一对应。
抽象工厂: 定义一个工厂方法用来返回一个产品,抽象工厂是工厂方法模式的核心,所有创建对象的工厂类都必须实现该接口。
具体工厂:实现了抽象工厂制造对象的方法,由调用着决定需要制作的对象,返回一个具体的实例对象。
抽象产品Milk
public abstract class Milk { public abstract void prepareRawMaterials(); void obtainRawMaterials() { System.out.println("获取对应原材料"); } void machiningObtainRawMaterials(){ System.out.println("加工原材料"); } void productionCompleted(){ System.out.println("牛奶生产完成"); } void doPackage(){ System.out.println("包装成品牛奶"); } }
具体产品MilkMengNiu
public class MilkMengNiu extends Milk{ @Override public void prepareRawMaterials() { System.out.println("采购制作蒙牛的原材料"); } }
具体产品MilkTeLunSu
public class MilkTeLunSu extends Milk { @Override public void prepareRawMaterials() { System.out.println("采购制作特仑苏的原材料"); } }
具体产品MilkYiLi
public class MilkYiLi extends Milk { @Override public void prepareRawMaterials() { System.out.println("采购制作伊利的原材料"); } }
具体工厂
public class MilkFactory implements Factory{ public Milk getMilk(String milkType){ Milk milk = null; if(milkType == null){ return null; } if(milkType.equalsIgnoreCase("TeLunSu")){ milk = new MilkTeLunSu(); } else if(milkType.equalsIgnoreCase("MengNiu")){ milk = new MilkMengNiu(); } else if(milkType.equalsIgnoreCase("YiLi")){ milk = new MilkYiLi(); } milk.prepareRawMaterials(); milk.obtainRawMaterials(); milk.machiningObtainRawMaterials(); milk.productionCompleted(); milk.doPackage(); return milk; } }
抽象工厂
public interface Factory { Milk getMilk(String milkType); } class TestMilkFactory{ public static void main(String[] args) { Factory factory = new MilkFactory(); factory.getMilk("TeLunSu"); System.out.println("--------------"); factory.getMilk("MengNiu"); System.out.println("--------------"); factory.getMilk("YiLi"); } }
执行结果
采购制作特仑苏的原材料 获取对应原材料 加工原材料 牛奶生产完成 包装成品牛奶 -------------- 采购制作蒙牛的原材料 获取对应原材料 加工原材料 牛奶生产完成 包装成品牛奶 -------------- 采购制作伊利的原材料 获取对应原材料 加工原材料 牛奶生产完成 包装成品牛奶