工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。 使用该模式的主要目的是为了解耦和。
工厂模式可以分为三类:
1)简单工厂模式(Simple Factory)
一个抽象产品类,可以派生出多个具体产品类。
一个具体工厂类。
具体工厂类能创建具体产品类的实例。
public class Customer {
public static void main(String[] args)
{
PhoneFactory factory = new PhoneFactory();
Phone mi4 = factory.createPhone("xiaomi");
Phone _4s = factory.createPhone("iphone");
Phone p8 = factory.createPhone("huawei");
}
}
class PhoneFactory //工厂类
{
public Phone createPhone(String brand)
{
switch(brand)
{
case "iphone":
return new Iphone();
case "xiaomi":
return new XiaoMi();
case "huawei":
return new HuaWei();
default:
break;
}
return null;
}
}
class Phone//抽象产品
{
public Phone(){}
}
class Iphone extends Phone//具体产品
{
public Iphone(){System.out.println("Create Iphone");}
}
class XiaoMi extends Phone//具体产品
{
public XiaoMi(){System.out.println("Creat XiaoMi");}
}
class HuaWei extends Phone//具体产品
{
public HuaWei() {System.out.println("Creat HuaWei");}
}
从开闭原则(对扩展开放,对修改封闭)上来分析下简单工厂模式。当客户不再满足现有的车型号的时候,想要一种速度快的新型车,只要这种车符合抽象产品制定的合同,那么只要通知工厂类知道就可以被客户使用了。所以对产品部分来说,它是符合开闭原则的;但是工厂部分好像不太理想,因为每增加一个品牌,都要在工厂类中增加相应的创建业务逻辑(createBMW(int type)方法需要新增case),这显然是违背开闭原则的。可想而知对于新产品的加入,工厂类是很被动的。对于这样的工厂类,我们称它为全能类或者上帝类。 这时工厂方法模式作出现了, 工厂类定义成了接口,而每新增的车种类型,就增加该车种类型对应工厂类的实现,这样工厂的设计就可以扩展了,而不必去修改原来的代码。
2)工厂方法模式(Factory Method)
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
class Phone//抽象产品
{
public Phone(){}
}
class Iphone extends Phone//具体产品
{
public Iphone(){System.out.println("Create Iphone");}
}
class XiaoMi extends Phone//具体产品
{
public XiaoMi(){System.out.println("Creat XiaoMi");}
}
class HuaWei extends Phone//具体产品
{
public HuaWei() {System.out.println("Creat HuaWei");}
}
interface PhoneFactory//抽象工厂
{
Phone creatPhone();
}
class IphoneFactory implements PhoneFactory //具体工厂
{
public Phone creatPhone()
{
return new Iphone();
}
}
class XiaoMiFactory implements PhoneFactory //具体工厂
{
public Phone creatPhone()
{
return new XiaoMi();
}
}
class HuaWeiFactory implements PhoneFactory //具体工厂
{
public Phone creatPhone()
{
return new HuaWei();
}
}
public class Customer //客户端
{
public static void main(String[] args)
{
Phone mi4 = new XiaoMiFactory().creatPhone();
Phone _4s = new IphoneFactory().creatPhone();
Phone p8 = new HuaWeiFactory().creatPhone();
}
}
工厂方法模式仿佛已经很完美的对对象的创建进行了包装,使得客户程序中仅仅处理抽象产品角色提供的接口,但使得对象的数量成倍增长。当产品种类非常多时,会出现大量的与之对应的工厂对象,这不是我们所希望的。
3)抽象工厂模式(Abstract Factory)
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。