为什么要用工厂方法模式

1.什么是工厂方法模式

        工厂方法(Factory Method)模式的是定义一个创建产品对象的工厂接口或抽象方法,让子类决定实例化哪一个类。工厂方法是一个类的实例化延迟的其子类。因为每一个具体产品类对应着一个具体的工厂类,故增加具体产品时只需要增加一个具体工厂类.。工厂方法模式是简单工厂模式的进一步抽象和推广,克服了简单工厂的违背开放-封闭原则的缺点,又保持了封装对象创建过程的优点。



为什么要用工厂方法模式_第1张图片

2.为什么要用工厂方法模式

       工厂方法模式与简单工厂模式的区别在于工厂方法模式比简单工厂模式多出一个抽象工厂接口,每一个具体工厂实现某个具体产品的实现。比如生成每本书都需要许多信息,书名,出版社,生成时间和生成顺序,但是不同的书籍信息要求不确定。


Book.java

public interface Book {
	public void read();
}

C_Book.java

public class C_Book implements Book {
	private String name = "读C语言从入门到入土";
	private String date;
	private String publishing_house;
	private int order;
	
	public C_Book(String date, String publishing_house, int order) {
		this.date = date;
		this.publishing_house = publishing_house;
		this.order = order;
	}
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getDate() {
		return date;
	}

	public void setDate(String date) {
		this.date = date;
	}

	public String getPublishing_house() {
		return publishing_house;
	}

	public void setPublishing_house(String publishing_house) {
		this.publishing_house = publishing_house;
	}
	
	public int getOrder() {
		return order;
	}

	public void setOrder(int order) {
		this.order = order;
	}
	
	
	@Override
	public void read() {
		System.out.println(getName()+"    "+getDate()+"    "+getPublishing_house()+"    "+getOrder());
	}

}

C_BookFactory.java

public class C_BookFactory implements AbstractFactory {

	private String date;
	private String publishing_house;
	private int order;
	
	public C_BookFactory() {
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");//设置日期格式
		date = df.format(new Date());
		publishing_house = "C_Book public";
		order = 1;
	}
	
	@Override
	public Book getBook() {
		return new C_Book(date, publishing_house, order++);
	}

}

Client.java

public class Client {
	
	public static void main(String[] args) {
			
		AbstractFactory factory = new C_BookFactory();
		factory.getBook().read();
		factory.getBook().read();
		factory.getBook().read();
		factory.getBook().read();
	}	

}
结果:
为什么要用工厂方法模式_第2张图片


        通过接口规定每个具体工厂需要实现的方法,不需要考虑具体产品如何生成,将生成具体产品的细节放到具体工厂中取实现。当工厂生成产品需要更多的配置信息,将所有产品所需的配置信息都放在简单工厂中太过杂乱,也不便于代码维护。将生成某个产品的信息抽取出来,单独放到一个类中,每个具体工厂对应某个具体产品,使得具体工厂的职能更加单一,代码简洁。使信息局部化,降低了类的复杂性,变更引起的风险降低。

你可能感兴趣的:(设计模式)