0.阐述
工厂方法模式是一类产品的生产,如:畜牧场只养动物,电视机厂只生产电视机。
同种类
称为同等级
,也就是说工厂方法模式只产生同等级
的产品,但现实生活中许多工厂是综合性工厂,能产生多等级
的产品,如:农场里既养动物又养植物。小米既生产手机也生产空调、门锁、电视、笔、杯子。
抽象工厂是生产同一个产品族的不同等级产品
1.定义
抽象工厂模式:是为访问类
提供一个创建一组相关或相互依赖的对象
的接口
,且访问类无须指定所要产品的具体类
就能得到同族的产品
的结构模式。
抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。
2.优点与缺点
使用抽象工厂模式一般要满足以下条件。
- 系统中有多个产品族,每个具体工厂创建同一族但属于不同等级机构的产品。
- 系统只可能消费其中某一族产品,即同族产品一起使用。
抽象工厂模式除了具有工厂方法模式的优点外,其他主要优点如下。
- 可以在类的内部对产品族中相关联的多等级产品进行共同管理,而且不必专门引入多个新的类来进行管理。
- 当增加一个新的产品族时不需要修改源代码,满足开闭原则。
缺点:
- 当产品族中需要增加一个新的产品时,所有共产类都需要进行修改。
3.实现
模式的结构
抽象工厂模式的主要角色。
1)抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法newProduct(),可以创建多个不同等级的产品。
2)具体工厂(Concrete Factory):主要实现抽象工厂中的多个抽象方法,完成产品的创建。
3)抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
4)具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对多的关系。
4.示例
以海尔能生产电视和空调,TCL也能生产电视和空调为例。
4.1抽象类
4.1.1抽象工厂类
package ink.poesy.design.AbstractFactoryDesign;
public interface AbstractFactory {
public Product newProduct1();
public Product2 newProduct2();
}
4.1.2抽象产品类->空调
package ink.poesy.design.AbstractFactoryDesign;
public interface Product {
public void show();
}
4.1.2抽象产品类->电视
package ink.poesy.design.AbstractFactoryDesign;
public interface Product2 {
public void show();
}
额,好像跟空调的一样
4.2海尔
4.2.1海尔的具体工厂
package ink.poesy.design.AbstractFactoryDesign;
public class ConcreteFactory implements AbstractFactory {
@Override
public Product newProduct1() {
System.out.println("海尔->生产具体产品·空调·");
return new ConcreteProduct();
}
@Override
public Product2 newProduct2() {
System.out.println("海尔->生产具体产品·电视·");
return new ConcreteProduct2();
}
}
4.2.2海尔的具体产品类->空调
package ink.poesy.design.AbstractFactoryDesign;
public class ConcreteProduct implements Product {
@Override
public void show() {
System.out.println("海尔产出空调");
}
}
4.2.3海尔的具体产品类->电视
package ink.poesy.design.AbstractFactoryDesign;
public class ConcreteProduct2 implements Product2 {
@Override
public void show() {
System.out.println("海尔产出电视");
}
}
4.3TCL
4.3.1TCL的具体工厂
package ink.poesy.design.AbstractFactoryDesign;
public class ConcreteFactory2 implements AbstractFactory {
@Override
public Product newProduct1() {
System.out.println("TCL->空调");
return new ConcreteProduct21();
}
@Override
public Product2 newProduct2() {
System.out.println("TCL->电视");
return new ConcreteProduct22();
}
}
4.3.2TCL的具体产品类->空调
package ink.poesy.design.AbstractFactoryDesign;
public class ConcreteProduct21 implements Product {
@Override
public void show() {
System.out.println("TCL产出空调");
}
}
4.3.3TCL的具体产品类->电视
package ink.poesy.design.AbstractFactoryDesign;
public class ConcreteProduct22 implements Product2 {
@Override
public void show() {
System.out.println("TCL产出电视");
}
}
4.4测试
4.4.1海尔测试
package ink.poesy.design.AbstractFactoryDesign;
public class Test {
public static void main(String[] args) throws Exception {
AbstractFactory abstractFactory ;
Product product1;
Product2 product2;
//Class<?> concreteFactory = Class.forName("ConcreteFactory");
//abstractFactory= (AbstractFactory)concreteFactory.newInstance();
abstractFactory = new ConcreteFactory();
abstractFactory.newProduct1().show();
abstractFactory.newProduct2().show();
}
}
运行效果
4.4.2TCL测试
package ink.poesy.design.AbstractFactoryDesign;
public class Test {
public static void main(String[] args) throws Exception {
AbstractFactory abstractFactory ;
Product product1;
Product2 product2;
//Class<?> concreteFactory = Class.forName("ConcreteFactory");
//abstractFactory= (AbstractFactory)concreteFactory.newInstance();
只是修改这里为TCL具体工厂
abstractFactory = new ConcreteFactory2();
abstractFactory.newProduct1().show();
abstractFactory.newProduct2().show();
}
}
运行结果
5.参考文章
[1].C语言中文网
本文为学习笔记来源整理自网络,如有侵犯留言联系。
以上内容如有争议、指正,留言给我~