博客中讲了简单工厂模式,工厂模式,抽象工厂模式三种
本文只讲工厂模式
个人认为工厂模式的组成:
抽象工厂,具体工厂
抽象产品,具体产品
(工厂模式中用到了模板模式)
具体代码如下:
代码1:Factory.java
package framework;
public abstract class Factory {
public final Product create(String owner) {
Product p=createProduct(owner);
registerProduct(p);
return p;
}
protected abstract Product createProduct(String owner);
protected abstract void registerProduct(Product product);
}
代码2:Product.java
package framework;
public abstract class Product {
public abstract void use();
}
代码3:IDCardFactory.java
package idcard;
import java.util.ArrayList;
import java.util.List;
import framework.Factory;
import framework.Product;
public class IDCardFactory extends Factory {
private List list=new ArrayList();
protected Product createProduct(String owner) {
return new IDCard(owner);
}
protected void registerProduct(Product product) {
list.add(product);
}
public List getOnwers() {
return list;
}
}
代码4:IDCard.java
package idcard;
import framework.Product;
public class IDCard extends Product{
private String owner;
IDCard(String owner) {//default 只允许同一个包下的子类或其他类调用
System.out.println("生成"+owner+"的id卡");
this.owner=owner;
}
// public IDCard(String owner) {
// System.out.println("生成"+owner+"的id卡");
// this.owner=owner;
// }
public void use() {
System.out.println("使用"+owner+"的id卡");
}
}
代码5:Main.java
import framework.Factory;
import framework.Product;
import idcard.IDCard;
import idcard.IDCardFactory;
import television.TelevisionFactory;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
// IDCard i1=new IDCard("张三"); 当IDCard构造方法是default时,同一个包下的子类或无关类可访问
// IDCard i2=new IDCard("李四");
// IDCard i3=new IDCard("王五");
// i1.use();
// i2.use();
// i3.use();
Factory fa=new IDCardFactory();
Product p1=fa.create("张三");
Product p2=fa.create("李四");
Product p3=fa.create("王五");
p1.use();
p2.use();
p3.use();
}
}
运行结果:
生成张三的id卡
生成李四的id卡
生成王五的id卡
使用张三的id卡
使用李四的id卡
使用王五的id卡
访问修饰符:
代码分析:
两个抽象类在package framwork中
两个具体类在package idcard中
由于具体产品类的构造方法采用的默认修饰符
所以在其他包内不能new 具体产品类的实例
所以具体产品类的实例的创建交给具体工厂类的实例来创建
实例的创建和使用分离
在抽象工厂类中,定义了整个的业余流程,
这里可以参考模板模式
所不同的是抽象工厂中的普通函数的返回值类型时抽象产品类型
这就跟上面的创建具体产品类实例联系到了一起
开头的博客中的示例用的是接口来表示抽象工厂和抽象产品
注意其接口中的抽象方法的返回值类型同样也是一样的道理
来自网络