1.抽象工厂模式:提供一个创建一系列相关或者相互依赖的接口,而无需指定它们具体的类。
(1)AbstractFactory(抽象工厂):它声明了一组用于创建一族产品的方法,每一个方法对应一种产品。
(2)ConcreateFactory(具体工厂):它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。
(3)AbstractProduct(抽象产品):它为每种产品声明接口,在抽象产品中声明了产品所具有的的业务方法。
(4)ConcreteProduct(具体产品):它定义了具体工厂生产的具体产品对象,实现了抽象产品接口中声明的业务方法。
/**抽象工厂可以使接口也可以是具体类或者抽象类*/
public interface AbstractFactory{
public AbstractProductA createProductA();//工厂方法一
public AbstractProductB createProductB();//工厂方法二
···
}
/**具体工厂类*/
public class ConcreateFactory1 extends AbstractFactory{
//工厂方法一
public AbstractProductA createProductA(){
return new ConcreteProductA1();
}
//工厂方法二
public AbstractProductB createProductB(){
return new ConcreteProductB1();
}
```
}
2.代码实例描述:在做一个类似编辑器的软件,现编辑器有数字、字母、符号三种字符。可以根据需求给这三种字符切换成黑色或者红色。下面就是具体的代码实现。(添加新的字符和颜色更加方便)。
/**数字接口,充当抽象产品*/
public interface Digit {
public void display();
}
/**黑色数字类,充当具体产品*/
public class BlackDigit implements Digit {
public void display(){
System.out.println("显示黑色数字");
}
}
/**红色数字,充当具体产品*/
public class RedDigit implements Digit {
public void display(){
System.out.println("显示红色数字");
}
}
/**字母抽象产品*/
public interface Letter {
public void display();
}
/**黑色字母,充当具体产品*/
public class BlackLetter implements Letter {
public void display(){
System.out.println("显示黑色字母");
}
}
/**Summer文本框类,充当具体产品*/
public class RedLetter implements Letter {
public void display(){
System.out.println("显示红色子母");
}
}
/**符号接口,充当抽象产品*/
public interface Mark {
public void display();
}
/**黑色符号类,充当具体产品*/
public class BlackMark implements Mark {
public void display(){
System.out.println("显示黑色符号");
}
}
/**红色符号类,充当具体产品*/
public class RedMark implements Mark {
public void display(){
System.out.println("显示红色符号");
}
}
/**字体颜色工厂接口,充当抽象工厂*/
public interface ColourFactory {
public Digit createDigit();
public Letter createLetter();
public Mark createMark();
}
/**黑色工厂,充当具体工厂*/
public class BlackColourFactory implements ColourFactory {
public Digit createDigit(){
return new BlackDigit();
}
public Letter createLetter(){
return new BlackLetter();
}
public Mark createMark(){
return new BlackMark();
}
}
/**红色工厂,充当具体工厂*/
public class RedColourFactory implements ColourFactory {
public Digit createDigit(){
return new RedDigit();
}
public Letter createLetter(){
return new RedLetter();
}
public Mark createMark(){
return new RedMark();
}
}
/**客户端测试类*/
public class Client{
public static void main(String args[]){
//使用抽象层定义
ColourFactory factory;
Digit dt;
Letter lt;
Mark mk;
//factory=(SkinFactory)XMLUtil.getBean();//为了开闭原则,可以利用反射机制和xml资源获取得到想使用的界面类
factory = new RedColourFactory();//想更换颜色可以在这里做修改
dt = factory.createDigit();
lt = factory.createLetter();
mk = factory.createMark();
dt.display();
lt.display();
mk.display();
}
}
运行结果显示
3.简单工厂模式、工厂模式和抽象工厂模式的主要不同之处。
简单工厂模式的工厂要负责多种产品的创建;工厂模式的工厂会有子工厂,每个子工厂对应创建一个产品;抽象工厂模式的工厂也有子工厂,但是子工厂可以创建一类产品。