设计模式-抽象工厂模式

        工厂模式提供创建对象的接口,是最常用的设计模式。本实例根据工厂模式的分类不同,介绍工厂模式之三的抽象工厂模式的使用方法及使用规则。
实现抽象工厂模式的技术要点如下:
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或者其他,这里不重要,重要的是前面的实现。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值