设计模式之一:Abstract Factory 抽象工厂

来源:互联网 发布:武汉知金教育怎么样 编辑:程序博客网 时间:2024/05/22 04:53

意图(Intent)

提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定他们具体的类。

动机(Motivation)

在软件系统中,经常面临着“一系列星湖依赖的对象”的创建工作;同时,由于需求的变化,往往促在更多系列对象的创建工作。

UML图

程序

首先建立描述一个人基本资料的 PersonInterface

package tw.idv.javax.demo.Interface; import java.util.Calendar; public interface PersonInterface {         public static final String ROLE = PersonInterface.class.getName();         public abstract String getId() throws Exception;         public abstract void setId(String id) throws Exception;         public abstract String getName() throws Exception;         public abstract void setName(String name) throws Exception;         public abstract Calendar getBirthday() throws Exception;         public abstract void setBirthday(Calendar birthday) throws Exception; }

接着实作描述一个人基础资料的抽象PersonInterfacelmpl

package tw.idv.javax.demo.Implements; import java.util.Calendar; import tw.idv.javax.demo.Interface.PersonInterface; public abstract class PersonInterfaceImpl implements PersonInterface {         private String id = null;         private String name = null;         private Calendar birthday = null;         public String getId() {                return id;        }         public void setId(String id) {                this.id = id;        }         public String getName() {                return name;        }         public void setName(String name) {                this.name = name;        }         public Calendar getBirthday() {                return birthday;        }         public void setBirthday(Calendar birthday) {                this.birthday = birthday;        } }

接着继承 PersonInterfaceImpl ,写一个描述孩童基本资料 Children

package tw.idv.javax.demo.Extends; import tw.idv.javax.demo.Implements.PersonInterfaceImpl; public class Children extends PersonInterfaceImpl { }

接着继承 PersonInterfaceImpl ,写一个描述成人基本资料 Adult 

package tw.idv.javax.demo.Extends; import tw.idv.javax.demo.Implements.PersonInterfaceImpl; public class Adult extends PersonInterfaceImpl {         private int income = 0;         public int getIncome() {                return income;        }         public void setIncome(int income) {                this.income = income;        } }

比较这几个类别,可以发现接口其实只是在定义一个架构,并没有实际的逻辑程式,而要实现接口时,若是还有其他物件需要继承你正要实现的类别时,最好把要实现的类别,定义为抽象类别

 适用性

在以下情况可以使用抽象工厂模式

  • 一个系统要独立于它的产品的创建、组合和表示时。
  • 一个系统要由多个产品系列中的一个来配置时。
  • 当你要强调一系列相关的产品对象的设计以变进行联合使用时。
  • 当你提供一个产品类库,而只想显示他们的接口而不是实现时。

优点

  • 具体产品从客户代码中被分离出来。
  • 容易改变产品的系列。
  • 将一个系列的产品族统一到一起创建。

缺点

在产品族中扩展新的产品是很困难的,它需要修改抽象工厂的接口。

要点

如果没有应对“多系列对象构建”的需求变化,则没有必要使用AbstractFactory模式,这时候使用简单的静态工厂完全可以。

“系列对象”值得是这些对象之间有相互依赖、或者作用的关系,例如游戏开发场景中的“道路”于“房屋”的依赖,“道路”于“地道”的依赖。

AbstractFactory模式主要是在于应用对“新系列”的需求变动。

AbstractFactory模式经常和FactoryMethod模式共同组合来应对“对象创建”的需求变化。

相关模式

工厂方法模式-

工厂类别通常工厂方法模式实现。

单例模式

具体工厂通常只需要一个实例。

     
     
原创粉丝点击