贵阳中国建设银行招聘信息网站,宣传片拍摄报价,研究生计划书模板,wordpress图wp-pic主题文章目录 概念结构实例优化 概念
抽象工厂#xff1a;提供一个创建一系列相关或相互依赖对象的接口#xff0c;而无须指定它们具体的类。 工厂方法是有一个类型的产品#xff0c;也就是只有一个产品的抽象类或接口#xff0c;而抽象工厂相对于工厂方法来说#xff0c;是有… 文章目录 概念结构实例优化 概念
抽象工厂提供一个创建一系列相关或相互依赖对象的接口而无须指定它们具体的类。 工厂方法是有一个类型的产品也就是只有一个产品的抽象类或接口而抽象工厂相对于工厂方法来说是有n个类型的产品也就具有n个产品的抽象类或接口。通俗的来讲就是由生成一个类型的产品转变为生成一组产品这是二者的主要区别两个的相同点是抽象的工厂接口里关联的永远是抽象的产品。
结构
抽象工厂的类图如下 AbstractFactory(抽象工厂)它声明了一组用于创建一族产品的方法每一个方法对应一种产品抽象的产品。 ConcreteFactory(具体工厂)它实现了在抽象工厂中声明的创建产品的方法生成一组具体产品。 AbstractProduct(抽象产品)它为每种产品声明接口在抽象产品中声明了产品所具有的业务方法。 ConcreteProduct(具体产品)它定义具体工厂生产的具体产品对象实现抽象产品接口中声明的业务方法。
实例
现在有海尔和海信两家公司都会生产电视和空调根据这种场景我们可以拆分一下把电视和空调作为产品族海尔和海信两家公司作为两个生产产品的抽象工厂它们都可以生产电视和空调。
空调的抽象产品
public interface HVAC {void displayHVAC();
}海尔空调
public class HaierHVAC implements HVAC {Overridepublic void displayHVAC() {System.out.println(海尔空调);}
}海信空调
public class HisenseHAVC implements HVAC{Overridepublic void displayHVAC() {System.out.println(海信空调);}
}电视的抽象产品
public interface TV {void displayTV();
}海尔电视
public class HaierTV implements TV{Overridepublic void displayTV() {System.out.println(海尔电视);}
}海信电视
public class HisenseHAVC implements HVAC{Overridepublic void displayHVAC() {System.out.println(海信空调);}
}抽象的工厂海信工厂和海尔工厂实现该接口
public interface AbstractFactory {TV createTV();HVAC createHVAC();
}海尔工厂
public class HaierFactory implements AbstractFactory{Overridepublic TV createTV() {return new HaierTV();}Overridepublic HVAC createHVAC() {return new HaierHVAC();}
}海信工厂
public class HisenseFactory implements AbstractFactory {Overridepublic TV createTV() {return new HisenseTV();}Overridepublic HVAC createHVAC() {return new HisenseHAVC();}
}客户端实现
public class Client {public static void main(String[] args) {//创建海尔的空调和电视AbstractFactory haierFactory new HaierFactory();TV haierTV haierFactory.createTV();HVAC haierHVAC haierFactory.createHVAC();haierTV.displayTV();haierHVAC.displayHVAC();}
}结果
优化
抽象工厂比工厂方法多了一个产品族的抽象也就是可以在工厂里创建多个产品。当新的公司介入时如长虹公司也来了那就在实现一个长虹公司的工厂实现抽象工厂然后重写里面的方法即可。 但是假如海尔和海信不仅仅生产空调和电视了还想生产冰箱那就需要再增加一个产品这时海尔和海信工厂都需要增加一个生产冰箱的方法假如有n个像海尔和海信这样的工厂那每个工厂都需要重写方法很难扩展。
于是我苦思冥想终于想到了一个方案先说下思路 1、因为当扩展新的产品时就要重写工厂的方法所以这个工厂里我打算只放一个获取产品的方法返回类型是一个抽象的产品。 2、要实现完全的开闭原则不太现实只能减少对原有类的影响要改的话只改动一个类就好所以可以把需要变动的地方都放到一个类中需要变动的点就是扩展新的产品。 3、因为客户面向的是抽象所以在客户端不能出现具体的产品只能出现抽象产品但是可以通过字符串的形式进行传参这样与每个类都没有耦合。 4、因为海尔和海信的工厂是固定的可以在里面出现魔法值。
下面是优化的效果 抽象工厂类只有一个抽象的方法
public interface AbstractFactory {Product create(String type);
}海尔工厂类可通过反射获取具体的产品
public class HaierFactory implements AbstractFactory {Overridepublic Product create(String type) {MapString, String productClassNameByType ExtendUtil.getProductClassNameByType(type);String className productClassNameByType.get(haier);Object o null;try {o Class.forName(className).newInstance();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}return (Product) o;}
}海信工厂类
public class HisenseFactory implements AbstractFactory {Overridepublic Product create(String type) {MapString, String productClassNameByType ExtendUtil.getProductClassNameByType(type);String className productClassNameByType.get(hisense);Object o null;try {o Class.forName(className).newInstance();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}return (Product) o;}
}一个工具类用来扩展使用存放产品族和具体产品之间的关系
public class ExtendUtil {private static MapString, MapString, String map new HashMap();static {map new HashMapString, MapString, String() {{MapString, String tvMap new HashMap();tvMap.put(haier, com.tfjybj.ming.design.absfactory.HaierTV);tvMap.put(hisense, com.tfjybj.ming.design.absfactory.HisenseTV);put(tv, tvMap);MapString, String hvacMap new HashMap();hvacMap.put(haier, com.tfjybj.ming.design.absfactory.HaierHVAC);hvacMap.put(hisense, com.tfjybj.ming.design.absfactory.HisenseHVAC);put(hvac, hvacMap);}};}public static MapString,String getProductClassNameByType(String type){return map.get(type);}
}最抽象的产品
public interface Product {void display();
}海尔电视
public class HaierTV implements Product {Overridepublic void display() {System.out.println(海尔电视);}
}海尔空调
public class HaierHVAC implements Product {Overridepublic void display() {System.out.println(海尔空调);}
}海信电视
public class HisenseTV implements Product {Overridepublic void display() {System.out.println(海信电视);}
}海信空调
public class HisenseHAVC implements Product{Overridepublic void display() {System.out.println(海信空调);}
}
客户端使用
public class Client {public static void main(String[] args) {//创建海尔的空调和电视AbstractFactory haierFactory new HaierFactory();//客户端面向的是抽象Product tv haierFactory.create(tv);Product hvac haierFactory.create(hvac);tv.display();hvac.display();}
}如果增加新的产品如冰箱或者新增工厂如长虹电器则需要改动的地方只有这里 欢迎您的观看有问题一起探讨。