设计模式-Abstract Factory
程序员文章站
2022-07-06 11:34:36
...
定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
特点:
1、多个产品系列
工厂方法一般是一个产品系,抽象工厂是多个
2、抽象工厂接口
提供获取多个获取产品的方法(产品簇)
3、具体工厂
工厂方法:只生产一种产品;抽象工厂:生产一个产品族
产品簇:是指位于不同产品等级结构中,功能相关联的产品组成的家族。一般是位于不同的等级结构中的相同位置上。对于每一个产品族,都有一个具体工厂。而每一个具体工厂创建属于同一个产品族,但是分属于不同等级结构的产品。
工厂方法与抽象工厂的区别和联系:
抽象工厂的类图结构:
JDK中的体现:
java.sql包
举例:
产品系:手机产品系;手机壳产品系
产品族:诺基亚(手机壳,手机),摩托罗拉(手机,手机壳)
结构图:
产品:手机
产品:手机壳
抽象工厂:
具体工厂:
Client客户端
特点:
1、多个产品系列
工厂方法一般是一个产品系,抽象工厂是多个
2、抽象工厂接口
提供获取多个获取产品的方法(产品簇)
3、具体工厂
工厂方法:只生产一种产品;抽象工厂:生产一个产品族
产品簇:是指位于不同产品等级结构中,功能相关联的产品组成的家族。一般是位于不同的等级结构中的相同位置上。对于每一个产品族,都有一个具体工厂。而每一个具体工厂创建属于同一个产品族,但是分属于不同等级结构的产品。
工厂方法与抽象工厂的区别和联系:
工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类只能创建一个具体产品类的实例。 抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类可以创建多个具体产品类的实例。 区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
抽象工厂的类图结构:
JDK中的体现:
java.sql包
举例:
产品系:手机产品系;手机壳产品系
产品族:诺基亚(手机壳,手机),摩托罗拉(手机,手机壳)
结构图:
产品:手机
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(); } }
上一篇: 模拟JavaScript Array实现的List
下一篇: Linux用户与用户组概念