工厂模式提供创建对象的接口,是最常用的设计模式。本实例根据工厂模式的分类不同,介绍工厂模式之三的抽象工厂模式的使用方法及使用规则。
实现抽象工厂模式的技术要点如下:
1.抽象工厂模式和工厂方法模式的区别在于需要创建对象的复杂度上。而且抽象工厂模式是这三种模式中最为抽象、最具一般性的。
2.使用抽象工厂模式需要满足以下条件:系统中有多个产品族,二系统一次只可能消费其中一族产品;同属于同一个产品族的产品
3.抽象工厂模式的组成部分与工厂方法模式的组成部分相同。
运行结果如下
源程序解读
1.程序中定义一个植物类、一个花园的抽象类、三个不同花园的抽象类的实现类以及一个抽象工厂类。
程序中使用抽象工厂类实现对不同花园的选择。使用这样模式能够将实现类和他们的生成过程完全分割开来。
实现类被隐藏在工厂类中,调用者不必知道实现类的任何信息。
2.虽然抽象工厂中的子类继承了同一个超类,但是它们可以拥有与其他子类不同的方法。
3.对于源程序Garden作为父类,调用GardenMaker的getGarden方法,根据不同的参数,调用Garden不同的实现子类Elegant、Practical和Lazy
这个三个子类都实现了抽象类Garden的三个方法;
同时对于抽象类Garden中三个抽象方法的返回值可以是对象Plant,也可以返回整形值int或者其他,这里不重要,重要的是前面的实现。
实现抽象工厂模式的技术要点如下:
1.抽象工厂模式和工厂方法模式的区别在于需要创建对象的复杂度上。而且抽象工厂模式是这三种模式中最为抽象、最具一般性的。
2.使用抽象工厂模式需要满足以下条件:系统中有多个产品族,二系统一次只可能消费其中一族产品;同属于同一个产品族的产品
3.抽象工厂模式的组成部分与工厂方法模式的组成部分相同。
源代码
package Pattern;
import org.omg.PortableInterceptor.SYSTEM_EXCEPTION;
/**
*花园布局-抽象工厂模式
* */
class Plant {//植物
String name; //植物名称
public Plant(String name){ //有参构造子
this.name=name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
abstract class Garden { //抽象类 花园 只定义方法
public abstract Plant getShade(); //花台上的植物
public abstract Plant getCenter(); //中间的植物
public abstract Plant getBorder(); //边上的植物
}
class Elegant extends Garden { //典雅型
public Plant getShade(){//花台上的植物
return new Plant("兰草");}
public Plant getCenter(){
return new Plant("榕树");//中间的植物
}
public Plant getBorder(){//边上的植物
return new Plant("郁金香");
}
}
class Practical extends Garden { //实用性
public Plant getShade(){//花台上的植物
return new Plant("葡萄");}
public Plant getCenter(){
return new Plant("石榴");//中间的植物
}
public Plant getBorder(){//边上的植物
return new Plant("丝瓜");
}
}
class Lazy extends Garden { //懒人型
public Plant getShade(){//花台上的植物
return new Plant("月季");}
public Plant getCenter(){
return new Plant("茶花");//中间的植物
}
public Plant getBorder(){//边上的植物
return new Plant("竹子");
}
}
class GardenMaker{ //抽象工厂类 ,本文件中核心逻辑所在的类
private static Garden garden;
public static Garden getGarden(String type){
garden=new Elegant();
if(type.equals("实用型")){
garden=new Practical();
}
if(type.equals("懒人型")){
garden=new Lazy();
}
return garden;
}
}
public class TextAbstractFactory{
public static void main(String[] args) {
Garden garden=GardenMaker.getGarden("实用型");
Plant Shade=garden.getShade();//
Plant Center=garden.getCenter();//
Plant Border=garden.getBorder();//
System.out.println("花台上的植物:"+Shade.getName());
System.out.println("中间的植物:"+Center.getName());
System.out.println("边上的植物:"+Border.getName());
}
}
运行结果如下
源程序解读
1.程序中定义一个植物类、一个花园的抽象类、三个不同花园的抽象类的实现类以及一个抽象工厂类。
程序中使用抽象工厂类实现对不同花园的选择。使用这样模式能够将实现类和他们的生成过程完全分割开来。
实现类被隐藏在工厂类中,调用者不必知道实现类的任何信息。
2.虽然抽象工厂中的子类继承了同一个超类,但是它们可以拥有与其他子类不同的方法。
3.对于源程序Garden作为父类,调用GardenMaker的getGarden方法,根据不同的参数,调用Garden不同的实现子类Elegant、Practical和Lazy
这个三个子类都实现了抽象类Garden的三个方法;
同时对于抽象类Garden中三个抽象方法的返回值可以是对象Plant,也可以返回整形值int或者其他,这里不重要,重要的是前面的实现。