欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

设计模式-Abstract Factory

程序员文章站 2022-07-06 11:34:36
...
定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

特点:
1、多个产品系列
   工厂方法一般是一个产品系,抽象工厂是多个
2、抽象工厂接口
   提供获取多个获取产品的方法(产品簇)
3、具体工厂
   工厂方法:只生产一种产品;抽象工厂:生产一个产品族

产品簇:是指位于不同产品等级结构中,功能相关联的产品组成的家族。一般是位于不同的等级结构中的相同位置上。对于每一个产品族,都有一个具体工厂。而每一个具体工厂创建属于同一个产品族,但是分属于不同等级结构的产品。


工厂方法与抽象工厂的区别和联系:

工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。   
                                一个抽象工厂类,可以派生出多个具体工厂类。 
                      每个具体工厂类只能创建一个具体产品类的实例。 

抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 
                              一个抽象工厂类,可以派生出多个具体工厂类。 
                              每个具体工厂类可以创建多个具体产品类的实例。 

区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
               工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。


抽象工厂的类图结构:

设计模式-Abstract Factory
            
    
    博客分类: design pattern(java) 设计模式Abstract Factory 

JDK中的体现:
java.sql包

设计模式-Abstract Factory
            
    
    博客分类: design pattern(java) 设计模式Abstract Factory 


举例:
产品系:手机产品系;手机壳产品系
产品族:诺基亚(手机壳,手机),摩托罗拉(手机,手机壳)


结构图:

设计模式-Abstract Factory
            
    
    博客分类: design pattern(java) 设计模式Abstract Factory 


产品:手机
public interface Mobile {
	public void call();
}

public class MotorolaMobile implements Mobile {

	@Override
	public void call() {
		System.out.println("I am Motorola mobile");
	}

}

public class NokiaMobile implements Mobile {

	@Override
	public void call() {
		System.out.println("I am Nokia mobile");
	}

}



产品:手机壳
public interface MobileCard {
	public void mark();
}

public class MotorolaMobileCard implements MobileCard {
	@Override
	public void mark() {
		System.out.println("I am a MotorolaMobileCard");
	}
}

public class NokiaMobileCard implements MobileCard {
	@Override
	public void mark() {
		System.out.println("I am a NokiaMobileCard");
	}
}



抽象工厂:
public interface MobileFactory {
	public Mobile createMobile();
	
	public MobileCard createMobileCard();
}



具体工厂:
public class MotorolaFactory implements MobileFactory {

	@Override
	public Mobile createMobile() {
		return new MotorolaMobile();
	}

	@Override
	public MobileCard createMobileCard() {
		return new MotorolaMobileCard();
	}

}



public class NokiaFactory implements MobileFactory {

	@Override
	public Mobile createMobile() {
		return new NokiaMobile();
	}

	@Override
	public MobileCard createMobileCard() {
		return new NokiaMobileCard();
	}

}


Client客户端
/**
 * 
 * @author xinchun.wang
 * 工厂方法的优点在于:可以通过客户端指定具体工厂,实现实例创建的封装
 * 静态工厂方法无法扩展,违背了 ’开闭原则‘
 */
public class Client {
	public static void main(String[] args) {
		MobileFactory mbf = new NokiaFactory();
		Mobile mb = mbf.createMobile();
		MobileCard mc = mbf.createMobileCard();
		mb.call();
		mc.mark();
		
		System.out.println("----------------------------");
		mbf = new MotorolaFactory();
		mb = mbf.createMobile();
		mc = mbf.createMobileCard();
		mb.call();
		mc.mark();
	}
}
  • 设计模式-Abstract Factory
            
    
    博客分类: design pattern(java) 设计模式Abstract Factory 
  • 大小: 21 KB
  • 设计模式-Abstract Factory
            
    
    博客分类: design pattern(java) 设计模式Abstract Factory 
  • 大小: 16.7 KB