工厂模式的UML结构:
Product: 抽象产品,所有的产品必须实现这个共同的接口,使用这些产品的类既可以引用这个接口,而不是具体类
ConcreteProduct: 具体产品
Creator:抽象工厂,实现了所有操作产品的方法,但不实现工厂方法,Creator所有子类都要实现factoryMethod()方法
ConcreteCreator:具体工厂。制造产品的实际工厂,负责创建一个或多个具体产品,只有ConreteCreator类知道如何创建产品
```
/*
*使用简单工厂
*/
//创建一个Pizza抽象类定义创建的方法
public abstract class Pizza{
public abstract void createPrizza();
}
//定义一个具体的Pizza可以直接继承定义好的抽象类并重写定义的抽象方法
class ChinesePizza extends Pizza{
public void createPizza()
{
System.out.println("ChinesePizza");
}
}
//书写测试类
class Test{
public Pizza productPizza(String type)
{
if(type.equals("a"))
{
return new AmericanPizza();
}else if(type.equals("b"))
{
return new ChinesePizza();
}
return null;
}
public static void main(String args[]){
//定义好一个要生产的Pizza
//new 一个工厂对象来进行生产,然后可以直接调用Pizza类中的生产方法
Factory f = new Factory();
Pizza pizza = f.producntPizza("b");
pizza.createPizza();
}
}
```
上述方法是简单工厂:违反了卡比原则(对扩展开发,对修改关闭)
下面介绍比这个方法效率稍微高些的工厂方法
/*
*工厂方法
*/publicclassPizzaTest{publicstaticvoidmain(String[] args){ PizzaFactory pizzaFactory =newChinesePizzaFactory(); Pizza pizza = pizzaFactory.getPizza(); System.out.println(pizza); }}//定义Pizza类classPizza{}//后面定义相应具体类去继承实现其中的方法等classChinesePizzaextendsPizza{}classEnglandPizzaextendsPizza{}//定义抽象Pizza工厂并定义方法abstractclassPizzaFactory{publicabstractPizzagetPizza();}//需要相应的工厂进行定义去实现classChinesePizzaFactoryextendPizzaFactory{@OverridepublicPizzagetPizza(){returnnewChinesePizza(); }}classEnglandPizzaFactoryextendPizzaFactory{@OverridepublicPizzagetPizza(){returnnewEnglandPizza(); }}
以上就是工厂方法:
优点:
1.在工厂方法中,用户只需要知道所要产品的具体工厂,不用关心具体的创建过程,甚至不需要具体产品类的类名。
2.在系统增加新的产品时,我们只需要添加一个具体产品类和对应的实现工厂,不用对原来的工厂进行修改,更好的符合“开闭原则”
缺点:
每次增加产品时都需要增加一个具体类和对象来实现工厂,这样系统中的类会成倍的增加,在一定程度上增加了系统的复杂度,同时也增加了系统对实体类的依赖,并不是一个很好的方法;但是比起简单工厂来说是不错的
综上我们在介绍一个方法:抽象工厂方法
/*
*抽象工厂(生产产品族,不添加成品)
*/publicclassPizza{}publicclassMantou{}//分别继承publicclassChinesePizzaextendsPizza{}publicclassChineseMantouextendsPizza{}//定义一个抽象工厂publicabstaicclassFactory{publicabstractPizzacreatePizza();publicabstractMantoucreateMantou();}//定义具体工厂publicclassChineseFactoryextendsFactory{@OverridepublicPizzacreatePizza()[ return newChinesePizza(); ]@OverridepublicMantoucreateMantou(){// TODO Auto-generated method stubreturnnewChineseMantou();}}//定义测试类publicclassTest{publicstaticvoidmain(String[] args){//当使用时可以直接new 出来相应的类出来Factory f =newChineseFactory(); Mantou m = f.createMantou(); System.out.println(m); }}
抽象工厂模式就是提供一个接口,用于创建相关或者依赖对象的家族,而不需要明确指定具体类。
他的优点是隔离了具体类的生成,使得客户端不需要知道什么被创建;
缺点是新增新的行为会比较麻烦,当添加一个新的产品对象时,需要更改接口及其下所有子类
参与者:
AbsractFactory:抽象工厂,抽象工厂定义了一个接口,所有的具体工厂都必须实现此接口,这个接口包含了一组方法来用来生产产品;
ConcreateFactory:具体工厂,具体工厂是用于生产不同产品族,要创建一个产品,客户只需要使用其中一个工厂完全不需要实例化任何产品对象;
AbstractProduct:抽象产品,这是一个产品家族,每一个具体工厂都能产生一整组产品
Product::具体产品。