创建型模式的目的就是使对象的创建和使用分离
在工厂方法模式中,一个工厂只能生产一种产品,比如在海尔工厂中只生产了海尔电视,但是海尔品牌还生产其他产品呀,比如海尔冰箱,海尔空调。诚然,也很容易想到,在工厂类中添加其他产品不就得了,所以,在工厂方法模式的工厂中不只是生产一种产品就叫做抽象工厂模式。
先引入两个概念:
产品等级结构:产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。
产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中。
然而回想简单工厂方法模式,也是一个工厂生产多个产品,不同的是在简单工厂方法模式中生产的多个产品是同一类产品的不同品牌,在抽象工厂中生产的是同一品牌的不同类的产品。要注意区分。
先写三个三类产品三个接口:
public interface tv{
public abstract void play();
}
public interface refrigerator{
public abstract void run();
}
public interface air-condition{
public abstract void work();
}
在写三个产品接口的6个实现类:
class haiertv implements tv{
public void play(){
System.out.print("haiertv is playing");
}
}
class samsungtv implements tv{
public void play(){
System.out.print("samsungtv is playing");
}
}
class haierref implements refrigerator{
public void run(){
System.out.print("haieref is running");
}
}
class samsungref implements refrigerator{
public void run(){
System.out.print("samsungref is running");
}
}
class haierAir implements air-condition{
public void work(){
System.out.print("haierair is working");
}
}
class samsungAir implements air-condition{
public void work(){
System.out.print("samsungair is working");
}
}
写工厂的抽象类
public abstract class factory{
public abstract tv getTv();
public abstract air-condition getAir();
public abstract refrigerator getRef();
}
写具体工厂类的实现
public class haierfactory extends factory{
public tv getTv(){return new haiertv();}
public air-condition getAir(){return new haierair();}
public refrigerator getRef(){return new haierref();}
}
public class samsungfactory extends factory{
public tv getTv(){return new samsungtv();}
public air-condition getAir(){return new samsungair();}
public refrigerator getRef(){return new samsungref();}
}
缺点:增加新的工厂和产品族容易(直接继承就行了),增加新的产品等级结构麻烦(要改很多处的代码)。