ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

抽象工厂模式(Abstract Factory Pattern)

2021-01-19 12:02:22  阅读:216  来源: 互联网

标签:Pattern Abstract Factory 工厂 Fruit 抽象 产品 AbstractFactory public


一、抽象工厂模式的定义
抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。
二、抽象工厂的模式结构
抽象工厂模式中存在四种模式结构,分别是抽象工厂,具体工厂,抽象产品,具体产品。
(1)抽象工厂角色(AbstractFactory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。
(2)具体工厂角色(ConcreteFactory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
(3)抽象产品角色(AbstractProduct):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
(4)具体产品角色(Product):实现了抽象产品角色所定义的接口,由具体工厂来创建,它 同具体工厂之间是多对一的关系。

UML类图:
在这里插入图片描述
三、抽象工厂的模式实现
1.模式实现
抽象工厂类:

public abstract class AbstractFactory
{
    public abstract AbstractProductA createProductA();
    public abstract AbstractProductB createProductB();
}

具体工厂类:

public class ConcreteFactory1 extends AbstractFactory{
    public AbstractProductA createProductA(){
        return new ConcreteProductA1();
    }
    public AbstractProductB createProductB() {
        return new ConcreteProductB1();
    } 
}

2.实例(水果的采集)
抽象工厂类(FruitFactory):

package AbstractFactory;

//抽象工厂类
public interface FruitFactory {
	public Fruit getApple();//实例化Apple
	public Fruit getBanana();//实例化Banana
}

具体工厂类(NorthFruitFactory)(SouthFruitFactory):

package AbstractFactory;

//具体工厂类
public  class NorthFruitFactory implements FruitFactory{
	public Fruit getApple() {
		return new NorthApple();
	}
	public Fruit getBanana() {
		return new NorthBanana();
	}
}
package AbstractFactory;

//具体工厂类
public class SouthFruitFactory implements FruitFactory{
	public Fruit getApple() {
		return new SouthApple();
	}
	public Fruit getBanana() {
		return new SouthBanana();
	}
}

抽象产品类(Fruit):

package AbstractFactory;

//抽象产品类
public interface Fruit {
	public void get();//采集
}

抽象产品类(Apple)(Banana):

package AbstractFactory;
 //抽象产品Apple
public abstract class Apple implements Fruit{
	public abstract void get();
}
package AbstractFactory;

//抽象产品Banana
public abstract class Banana implements Fruit{
	public abstract void get();
}

具体产品类(NorthApple SouthApple):

package AbstractFactory;

//具体产品类(北方苹果)
public class NorthApple extends Apple{
	public void get() {
		System.out.println("采集北方苹果");
	}
}
package AbstractFactory;

//具体产品类(南方苹果)
public class SouthApple extends Apple{
	public void get() {
		System.out.println("采集南方苹果");
	}
}

具体产品类( NorthBanana SouthApple):

package AbstractFactory;

//具体产品类(北方香蕉)
public class NorthBanana extends Banana{
	public void get() {
		System.out.println("采集北方香蕉");
	}
}
package AbstractFactory;

//具体产品类(南方香蕉)
public class SouthBanana extends Banana{
	public void get() {
		System.out.println("采集南方香蕉");
	}
}

Client类:

package AbstractFactory;

public class Client {
	public static void main(String[] args) {
		
		FruitFactory ff1 = new NorthFruitFactory();
		Fruit apple1 = ff1.getApple();
		apple1.get();
		
		Fruit banana1 = ff1.getBanana();
		banana1.get();
		
		FruitFactory ff2 = new SouthFruitFactory();
		Fruit apple2 = ff2.getApple();
		apple2.get();
		
		Fruit banana2 = ff2.getBanana();
		banana2.get();
	}
}

运行结果:
在这里插入图片描述
UML类图:
在这里插入图片描述
四、抽象工厂的适用环境
(1)一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是重要的。

(2)系统中有多于一个的产品族,而每次只使用其中某一产品族。

(3)属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。

(4)系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。
五、抽象工厂的总结
1.优点
(1) 抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易。所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。另外,应用抽象工厂模式可以实现高内聚低耦合的设计目的,因此抽象工厂模式得到了广泛的应用。
(2)当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。这对一些需要根据当前环境来决定其行为的软件系统来说,是一种非常实用的设计模式。
(3)增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。

2.缺点
(1)在添加新的产品对象时,难以扩展抽象工厂来生产新种类的产品,这是因为在抽象工厂角色中规定了所有可能被创建的产品集合,要支持新种类的产品就意味着要对该接口进行扩展,而这将涉及到对抽象工厂角色及其所有子类的修改,显然会带来较大的不便。
(2)开闭原则的倾斜性(增加新的工厂和产品族容易,增加新的产品等级结构麻烦)

3.总结
抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。

抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构。

标签:Pattern,Abstract,Factory,工厂,Fruit,抽象,产品,AbstractFactory,public
来源: https://blog.csdn.net/weixin_44057997/article/details/112802758

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有