导言:
设计模式常常被分为以下三类:
创建型
创建对象时,不再由我们直接实例化对象;而是根据特定场景,由程序来确定创建对象的方式。如,工厂方法、抽象工厂模式、单例模式等。
构造型
用于帮助将多个对象组织成更大的结构。如,适配器模式、桥接模式、组合器模式等。
行为型
用于帮助系统间对象的通信,以及如何控制复杂系统中的流程。如,命令模式、解释器模式、迭代器模式等。
工厂模式图:
一、单例模式
public class Singleton
{public static Singleton
instance;
private
Singleton() {}
public static Singleton getInstance()
{
if (instance == null)
{
instance
= new Singleton();
}
return
instance;
} public
static void main(String[] args) {
Singleton instance1 =
Singleton.getInstance();
Singleton instance2 =
Singleton.getInstance();
System.out.println(instance1 ==
instance2);
}
}
(Spring中只需在配置实体Bean中指定 scope="singleton",便可实现单例)
二、简单工厂
当A实例需要调用B实例的方法时,不是通过new
B实例,而是通过一个能创建B实例的工厂BFactory来实现。
B b=new B();---à B
b=BFactory().getB();
略为改进后变为:
当A实例需要调用某种方法时,这种方法可以由B实例或B1实例实现。那么我们定义一个接口IB,让B和B1实现该接口。并且写一个IB工厂IBFactory,提供一个getIB()方法
public class A{
private IB ib;
public A(IB ib){
this.ib=ib;
}
public void
showMessage(){
ib.print();
}
}
public interface IB{
public abstract void
print();
}
public class B implements
IB{
public void print(){
}
}
public clsss B1 implements
IB{
public void print(){
}
}
public IBFactory{
public IB getIB(){
return new B();
}
}
--------------------------
IB
ib=IBFactory.getIB();
A a=new A(ib);
a.showMessage();
----------------------------
抽象工厂模式图:
三、工厂方法和抽象工厂
在简单工厂模式里,系统使用ProductFactory工厂类生产所有产品实例,且工厂类来决定生产那个类的实例。
3.1 工厂方法
在工厂方法中,如果我们不想在工厂类中进行逻辑判断,程序可以为不同产品类提供不同的工厂,不同的工厂类生产不同的产品。
图:
采用工厂方法后,客户端代码成功与被调用对象的实现类分离。
3.2
抽象工厂模式:为了解决客户端代码与不同工厂耦合的问题,接着考虑再增加一个工厂类,该类生产OutputFactory实例(根据传入的参数,生产不同的工厂实例)
public class
OutputFactoryFactory {
public static
OutputFactory getOutputFactory(String type) {
if
("better".equalsIgnoreCase(type)) {
return new
BetterOutputFactory();
} else {
return new
OutputFactory();
}
}
}
图: