工厂模式分为简单工厂、工厂模式、抽象工厂三种层级概念。简单工厂不属于23种设计模式,抽象工厂才是。
简单工厂
简单工厂主要就是通过工厂创建一个个不同的实例。
如:
abstract class Animal{
String name;
}
class Person extends Animal{
public Person(String name){
super();
this.name = name;
}
}
class Dog extends Animal{
public Dog(String name){
super();
this.name = name;
}
}
class Factory{
public Person getPerson(String name){
return new Person(name);
}
public Dog getDog(String name){
return new Dog(name);
}
}
工厂模式
工厂模式就是将单一工厂抽象化,通过不同的具体工厂来生产不同的实例。
abstract class Factory{
public abstract Animal create(String name);
}
class PersonFactory extends Factory{
public Animal create(String name){
return new Person(name);
}
}
class DogFactory extends Factory{
public Animal create(String name){
return new Dog(name);
}
}
抽象工厂
有时候,可能工厂单一生产一种实例满足不了我们的需求,就比如人分为老人、小孩、青年人。狗也一样。他们有不同的行为表现形式,但是他们都有行为方式,所以我们可以将这种行为方式抽象出来,在工厂中,分类对他们进行处理。
abstract class property{
protected abstract void behavior();
}
abstract class Young extends property{
String name;
protected Young (String name){
this.name = name;
}
}
abstract class Child extends property{
String name;
protected Child (String name){
this.name = name;
}
}
class YoungPeople extends Young{
public YoungPeople (String name){
super(name);
}
protected void behavior(){
System.out.print("年轻人要工作");
}
}
class ChildPeople extends Child {
public ChildPeople (String name){
super(name);
}
protected void behavior(){
System.out.print("孩子们贪玩");
}
}
abstract class Factory{
public abstract Young createYoung(String name);
public abstract Child createChild(String name);
}
class PersonFactory extends Factory{
public Young createYoung(String name){
return new YoungPeople(name);
}
public Child createChild(String name){
return new ChildPeople(name);
}
}
总结
简单工厂实质上并没有对对象进行一个很好得分类作用,也没有体现Java多态性(重载和重写)
工厂模式通过不同的工厂对生产的不同实力进行管理,在生产一种实例时,只需要创建对应的工厂,通过调用生产方法将对象生产出来,而且每次新增一种类型的对象,只需要新增一种工厂,简单体现了Java的多态性,也很好进行了解耦作用。
抽象工厂是工厂模式的一种进阶,此时,我们不再以一个对象为单位,而是以一种类别为单位,此时我们不再以对象来进行区分,而是以类型进行区分。当他们具有一定相同的行为特征时,可以将这些行为特征提取出来,再具体分类处理,如人和狗都属于动物,但是他们都有自己的行为特征,而老人和小孩的行为特征也是不一样的。这时候,人就是一种类别,而狗,又是另一种类别。总不能把人和狗混为一谈的,哈哈~~
其实本次代码还有很多可以优化的地方,比如工厂可以采用单例模式,部分可以采用泛型优化等。待后续熟练后优化~工厂菜鸟随笔感触。