内容来自实验楼,记录下来供自己学习。
工厂模式通常分为:
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
工厂模式代码:
// 抽象产品
abstract class Human {
public abstract void Eat();
public abstract void Sleep();
public abstract void Beat();
}
// 具体产品-男人
class Man extends Human{
public void Eat() {
System.out.println("Man can eat.");
}
public void Sleep() {
System.out.println("Man can sleep.");
}
public void Beat() {
System.out.println("Man can beat doudou.");
}
}
// 具体产品-女人
class Female extends Human{
public void Eat() {
System.out.println("Female can eat.");
}
public void Sleep() {
System.out.println("Female can sleep.");
}
public void Beat() {
System.out.println("Female can beat doudou.");
}
}
// 简单工厂
public class HumanFactory {
public static Human createHuman(String gender){
Human human = null;
if( gender.equals("man") ){
human = new Man();
}else if( gender.equals("female")){
human = new Female();
}
return human;
}
}
// 女娲造人
public class Goddess {
public static void main(String[] args) throws IOException {
// 造个男人
Human human = HumanFactory.createHuman("man");
human.Eat();
human.Sleep();
human.Beat();
}
}
工厂方法模式:
// 抽象产品
abstract class Human {
public abstract void Eat();
public abstract void Sleep();
public abstract void Beat();
}
// 具体产品-男人
class Man extends Human {
public void Eat() {
System.out.println("Man can eat.");
}
public void Sleep() {
System.out.println("Man can sleep.");
}
public void Beat() {
System.out.println("Man can beat doudou.");
}
}
// 具体产品-女人
class Female extends Human{
public void Eat() {
System.out.println("Female can eat.");
}
public void Sleep() {
System.out.println("Female can sleep.");
}
public void Beat() {
System.out.println("Female can beat doudou.");
}
}
// 简单工厂变为了抽象工厂
abstract class HumanFactory {
public abstract Human createHuman(String gender) throws IOException;
}
// 具体工厂(每个具体工厂负责一个具体产品)
class ManFactory extends HumanFactory{
public Human createHuman(String gender) throws IOException {
return new Man();
}
}
class FemaleFactory extends HumanFactory{
public Human createHuman(String gender) throws IOException {
return new Female();
}
}
// 女娲造人
public class Goddess {
public static void main(String[] args) throws IOException {
// 造个男人
HumanFactory hf = new ManFactory();
Human h = hf.createHuman("man");
h.Eat();
h.Sleep();
h.Beat();
}
}
抽象方法模式:
// 抽象产品
abstract class Human {
public abstract void Eat();
public abstract void Sleep();
public abstract void Beat();
}
// 具体产品-男人
class Man extends Human {
public void Eat() {
System.out.println("Man can eat.");
}
public void Sleep() {
System.out.println("Man can sleep.");
}
public void Beat() {
System.out.println("Man can beat doudou.");
}
}
// 具体产品-女人
class Female extends Human{
public void Eat() {
System.out.println("Female can eat.");
}
public void Sleep() {
System.out.println("Female can sleep.");
}
public void Beat() {
System.out.println("Female can beat doudou.");
}
}
// 简单工厂变为了抽象工厂
abstract class HumanFactory {
public abstract Human createHuman(String gender) throws IOException;
}
// 具体工厂(每个具体工厂负责一个具体产品)
class ManFactory extends HumanFactory{
public Human createHuman(String gender) throws IOException {
return new Man();
}
}
class FemaleFactory extends HumanFactory{
public Human createHuman(String gender) throws IOException {
return new Female();
}
}
// 女娲造人
public class Goddess {
public static void main(String[] args) throws IOException {
// 造个男人
HumanFactory hf = new ManFactory();
Human h = hf.createHuman("man");
h.Eat();
h.Sleep();
h.Beat();
}
}
工厂方法模式,抽象工厂模式区别:
-
产品等级结构:比如一个抽象类是食物,其子类有苹果、牛奶等等,则抽象食物与具体食物名称之间构成了一个产品等级结构。食物是抽象的父类,而具体的食物名称是其子类。
-
产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品。如 AKitchen 生产的苹果、刀子,苹果属于食物产品等级结构中,而刀子则属于餐具产品等级结构中。
抽象工厂模式:针对多个产品等级结构