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

意图(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模式共同组合来应对“对象创建”的需求变化。

相关模式

工厂方法模式-

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

单例模式

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

     
     

你可能感兴趣的:(设计模式之一:Abstract Factory 抽象工厂)